实现游戏的同时击键



在我的Java 2D游戏中,两辆坦克的控制如下:

储罐1

  • 向前移动:向上箭头
  • 调整移动角度:向左和向右箭头

储罐2

  • 向前移动:W键
  • 调整移动角度:A和D键

可以在坦克向前移动时调整坦克的角度(例如,在向上箭头时击中左箭头或右箭头)。同时向前移动两个坦克也是可能的。

然而,当一辆坦克向前移动改变其角度(例如,同时按下向上键和左/右键)时,另一辆坦克只能向前移动。也就是说,它无法调整角度(例如,同时打击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;
}
}
}

您可能会建议我使用KeyBindings,但有没有一种方法仍然使用KeyListener并使所有按钮同时工作而不会出错?谢谢

这可能是键盘电气特性的限制;非"游戏"键盘通常检测三个或三个以上同时按键的特定组合的能力有限。如果是这种情况(试试记事本中的四个键,看看问题是否也发生在那里),就没有软件解决方案了,但将"向前"映射到修改键可能会作为UI解决方案(修改键通常不受键重影的影响)。

请参阅http://en.wikipedia.org/wiki/Rollover_(键)了解更多详细信息。

最新更新