在我的Java 2D游戏中,两个坦克的控制如下:
坦克1
坦克2
可以在坦克向前移动时调整坦克的角度(例如,在击中向上箭头时击打左箭头或右箭头)。也可以同时向前移动两个罐。
然而,当一个坦克向前移动并且改变其角度(例如,同时击中向上和向左/向右键)时,另一个坦克仅能够向前移动。也就是说,它不能调整它的角度(例如,同时敲击W和A不起作用,而另一个坦克做同样的事情; A键被忽略)。
为什么?这是相关的代码:
在Board
类中,它具有大部分游戏逻辑:
while( game_is_running ) {
keysPressed1 = tank1.getKeys();
keysPressed2 = tank2.getKeys();
if(keysPressed1[0]==true)tank1.setAngle(tank1.getAngle()-3);
if(keysPressed1[1]==true)tank1.setAngle(tank1.getAngle()+3);
if(keysPressed1[2]==true){
tank1.setDX(2 * Math.cos(Math.toRadians(tank1.getAngle())));
tank1.setDY(2 * Math.sin(Math.toRadians(tank1.getAngle())));
}
if(keysPressed1[2]==false){
tank1.setDX(0);
tank1.setDY(0);
}
tank1.move();
if(keysPressed2[0]==true)tank2.setAngle(tank2.getAngle()-3);
if(keysPressed2[1]==true)tank2.setAngle(tank2.getAngle()+3);
if(keysPressed2[2]==true){
tank2.setDX( (-1) * ( 2 * Math.cos(Math.toRadians(tank2.getAngle()) ) ));
tank2.setDY( (-1) * (2 * Math.sin(Math.toRadians(tank2.getAngle()) ) ));
}
if(keysPressed2[2]==false){
tank2.setDX(0);
tank2.setDY(0);
}
tank2.move();
repaint();
}
在Tank
课程中:
public class Tank extends Entity {
public Tank(String type){
this.type = type;
if(type=="red"){
image = new ImageIcon(this.getClass().getResource("sprites/redtank1.PNG")).getImage();
x = 200 - image.getWidth(null);
y = 400;
}
if(type=="blue"){
image = new ImageIcon(this.getClass().getResource("sprites/bluetank1.PNG")).getImage();
x = 850;
y = 400;
}
width = image.getWidth(null);
height = image.getHeight(null);
angle = 0;
dx = 0;
dy = 0;
keysPressed = new boolean[3];
}
public void keyPressed(KeyEvent e){
int key = e.getKeyCode();
if(key == KeyEvent.VK_LEFT){
keysPressed[0] = true;
}
if(key == KeyEvent.VK_RIGHT){
keysPressed[1] = true;
}
if(key == KeyEvent.VK_UP){
keysPressed[2] = true;
}
if(key == KeyEvent.VK_A){
keysPressed[0] = true;
}
if(key == KeyEvent.VK_D){
keysPressed[1] = true;
}
if(key == KeyEvent.VK_W){
keysPressed[2] = true;
}
}
public void keyReleased(KeyEvent e){
int key = e.getKeyCode();
if(key == KeyEvent.VK_LEFT){
keysPressed[0] = false;
}
if(key == KeyEvent.VK_RIGHT){
keysPressed[1] = false;
}
if(key == KeyEvent.VK_UP){
keysPressed[2] = false;
}
if(key == KeyEvent.VK_A){
keysPressed[0] = false;
}
if(key == KeyEvent.VK_D){
keysPressed[1] = false;
}
if(key == KeyEvent.VK_W){
keysPressed[2] = false;
}
}
}
你可能会建议我使用Key Bindings,但有没有办法继续使用KeyListener并让所有按钮同时工作而不会出错?谢谢。
答案 0 :(得分:1)
这可能会限制键盘的电气特性;非“游戏”键盘通常具有有限的能力来检测三个或更多个同时键控的某些组合。如果是这种情况(尝试记事本中的四个键,并查看问题是否也出现在那里),可能没有软件解决方法,但将“转发”映射到修改键可以作为UI解决方法(修改键通常免除关键鬼影。
有关详细信息,请参阅http://en.wikipedia.org/wiki/Rollover_(key)。