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的强烈意见、你觉得你需要看的代码或任何东西,只要给我一声叫喊,我会尽快做出回应。很多人都有这个问题。这被称为键盘重影,意味着一些组合在便宜的键盘上根本不起作用。这就是高级游戏键盘存在的原因。所以你的代码没有问题。不可能进行优化。您需要使用有效的组合键<为了证明我的答案,这里有一些链接供您参考