Java-KeyListener多个键

Java-KeyListener多个键,java,keylistener,Java,Keylistener,现在我知道这个话题已经提过好几次了,这里:,这里:,这里:,例如。因此,我真的不能期望得到任何与这些例子不同的帮助。我还读到,你们中的大多数人建议我使用KeyBindings而不是keylisters来处理我现在决定要做的事情(见下文)。不过我还是想知道你们是否知道为什么我的代码出了问题 在这种情况下,我正在制作一个简单的2D游戏。我一直在跟随Newboston的教程开始学习,他推荐了KeyListeners。直到现在,当我遇到一个相当奇怪的bug时,它们对我来说一直工作得很好 问题是,当我把我

现在我知道这个话题已经提过好几次了,这里:,这里:,这里:,例如。因此,我真的不能期望得到任何与这些例子不同的帮助。我还读到,你们中的大多数人建议我使用
KeyBinding
s而不是
keylister
s来处理我现在决定要做的事情(见下文)。不过我还是想知道你们是否知道为什么我的代码出了问题

在这种情况下,我正在制作一个简单的2D游戏。我一直在跟随Newboston的教程开始学习,他推荐了
KeyListener
s。直到现在,当我遇到一个相当奇怪的bug时,它们对我来说一直工作得很好

问题是,当我把我的宇宙飞船转向左边时,它不会发射。这只会发生在这个特定的方向(八个可能的方向中),而且如果我已经在拍摄,我也无法将我的船驶向左上角

下面是我知道问题发生的代码。我真的看不出有什么好的解释。我真的相信我的电脑不能同时注册向上箭头、向左箭头和空格键是有问题的。这一点的最终证明当然是,例如,当我将fire按钮从空格键更改为F时,代码运行没有问题

//Imports

public class SpaceGame extends Core implements KeyListener{
    public static void main (String[] args){
        SpaceGame sg = new SpaceGame();
        sg.init();
        sg.run();
    }

    //Making all variables
private ScreenManager s;
private AffineTransform identityTransform;
private Image bg;
private Image[] shipImage = new Image[2];
private Image[] missileImage = new Image[2];
private String shipLocations[] = {/*IMAGE LOCATIONS*/};
private String missileLocations[] = {/*IMAGE LOCATIONS*/};
private Animation shipAnimation;
private Animation missileAnimation;
private Ship ship;
private ArrayList<Shot> shotList = new ArrayList<Shot>();
private boolean shooting;
private int shots = 0;

    public void init(){
        //Makes image objects, animations and some other stuff.
    }

    //This is called from the core class which has a continously running while loop in it.
    public void update(long timePassed){
        if(shooting){
            makeShot();
        }
        ship.update(timePassed);
        for(Shot shot : shotList){
            if(shot.getAlive()){
            shot.update(timePassed);
        }
    }
}

public void makeShot(){
    //Makes shots
}

public synchronized void draw(Graphics2D g, long time) {
    Window w = s.getFullScreenWindow();
    w.setFocusTraversalKeysEnabled(false);
    w.addKeyListener(this);
    g.drawImage(bg, 0, 0, null);
    for(Shot shot : shotList){
        if(shot.getAlive()){
            g.setTransform(shot.getTransform());
            g.drawImage(shot.getImage(), Math.round(shot.getCorsClone()[0]), Math.round(shot.getCorsClone()[1]), null);
        }
    }
    g.setTransform(ship.getTransform());
    g.drawImage(ship.getImage(), Math.round(ship.getCorsClone()[0]), Math.round(ship.getCorsClone()[1]), null);
    g.setTransform(identityTransform);
}


//Where the problem occurs
public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    if(keyCode == KeyEvent.VK_ESCAPE){
        stop();
    } else if(keyCode == KeyEvent.VK_UP){
        ship.setDY(-1);
        e.consume();
    } else if(keyCode == KeyEvent.VK_RIGHT){
        ship.setDX(1);
        e.consume();
    } else if(keyCode == KeyEvent.VK_DOWN){
        ship.setDY(1);
        e.consume();
    } else if(keyCode == KeyEvent.VK_LEFT){
        ship.setDX(-1);
        e.consume();
    } else if(keyCode == KeyEvent.VK_SPACE){
        shooting = true;
        e.consume();
    }
}

    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if(keyCode == KeyEvent.VK_UP){
            ship.setDY(0);
            e.consume();
        } else if(keyCode == KeyEvent.VK_RIGHT){
            ship.setDX(0);
            e.consume();
        } else if(keyCode == KeyEvent.VK_DOWN){
            ship.setDY(0);
            e.consume();
        } else if(keyCode == KeyEvent.VK_LEFT){
            ship.setDX(0);
            e.consume();
        } else if(keyCode == KeyEvent.VK_SPACE){
            shooting = false;
            e.consume();
        } 
    }

    public void keyTyped(KeyEvent e) {
        e.consume();
    }
}
//导入
公共类SpaceGame扩展核心实现KeyListener{
公共静态void main(字符串[]args){
SpaceGame sg=新的SpaceGame();
sg.init();
sg.run();
}
//制造所有变量
私人放映经理;
私有仿射变换标识变换;
私有图像背景;
私有映像[]shipImage=新映像[2];
私有映像[]missleimage=新映像[2];
私有字符串shipLocations[]={/*映像位置*/};
私有字符串missileLocations[]={/*图像位置*/};
私人动画;
私人动画制作;
私人船舶;
private ArrayList shotList=new ArrayList();
私人布尔射击;
私有int-shots=0;
公共void init(){
//制作图像对象、动画和其他一些东西。
}
//这是从核心类调用的,该类中有一个持续运行的while循环。
公共无效更新(已过很长时间){
如果(拍摄){
makeShot();
}
ship.update(时间已过);
对于(快照:快照列表){
if(shot.getAlive()){
shot.update(时间经过);
}
}
}
公共void makeShot(){
//投篮
}
公共同步作废绘图(图形2D g,长时间){
窗口w=s.getFullScreenWindow();
w、 setFocusTraversalKeysEnabled(false);
w、 addKeyListener(此);
g、 drawImage(bg,0,0,null);
对于(快照:快照列表){
if(shot.getAlive()){
g、 setTransform(shot.getTransform());
g、 drawImage(shot.getImage(),Math.round(shot.getCorsClone()[0]),Math.round(shot.getCorsClone()[1]),null);
}
}
g、 setTransform(ship.getTransform());
g、 drawImage(ship.getImage(),Math.round(ship.getCorsClone()[0]),Math.round(ship.getCorsClone()[1]),null);
g、 setTransform(identityTransform);
}
//问题发生在哪里
按下公共无效键(按键事件e){
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_ESCAPE){
停止();
}else if(keyCode==KeyEvent.VK_UP){
船。赛迪(-1);
e、 消费();
}else if(keyCode==KeyEvent.VK_RIGHT){
ship.setDX(1);
e、 消费();
}else if(keyCode==KeyEvent.VK_DOWN){
赛迪号(1);
e、 消费();
}else if(keyCode==KeyEvent.VK_左){
ship.setDX(-1);
e、 消费();
}else if(keyCode==KeyEvent.VK_空间){
射击=正确;
e、 消费();
}
}
公共无效密钥已释放(密钥事件e){
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_UP){
ship.setDY(0);
e、 消费();
}else if(keyCode==KeyEvent.VK_RIGHT){
ship.setDX(0);
e、 消费();
}else if(keyCode==KeyEvent.VK_DOWN){
ship.setDY(0);
e、 消费();
}else if(keyCode==KeyEvent.VK_左){
ship.setDX(0);
e、 消费();
}else if(keyCode==KeyEvent.VK_空间){
射击=假;
e、 消费();
} 
}
public void keyTyped(KeyEvent e){
e、 消费();
}
}
因此,总结一下,我的问题是一个模糊的问题。我不知道空格键有什么特别的地方吗?我的程序中有没有bug?或者,也许,只是我的键盘有什么问题


任何关于我的编码的评论、想法、抱怨、对我的英语的抱怨、关于是否使用
keylister
s或
KeyBinding
s的强烈意见、你觉得你需要看的代码或任何东西,只要给我一声叫喊,我会尽快做出回应。

很多人都有这个问题。这被称为键盘重影,意味着一些组合在便宜的键盘上根本不起作用。这就是高级游戏键盘存在的原因。所以你的代码没有问题。不可能进行优化。您需要使用有效的组合键<为了证明我的答案,这里有一些链接供您参考


我必须说,这是我在这里得到的最令人沮丧但也是最好的答案。谢谢顺便说一句,没有办法解决这个问题?是否对键盘进行了修补?不,这取决于键盘硬件的内部键矩阵。唯一的选择是:买一个游戏键盘。