实现游戏的同步击键

时间:2014-01-01 18:06:22

标签: java awt keylistener

在我的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;
        }
    }

}

你可能会建议我使用Key Bindings,但有没有办法继续使用KeyListener并让所有按钮同时工作而不会出错?谢谢。

1 个答案:

答案 0 :(得分:1)

这可能会限制键盘的电气特性;非“游戏”键盘通常具有有限的能力来检测三个或更多个同时键控的某些组合。如果是这种情况(尝试记事本中的四个键,并查看问题是否也出现在那里),可能没有软件解决方法,但将“转发”映射到修改键可以作为UI解决方法(修改键通常免除关键鬼影。

有关详细信息,请参阅http://en.wikipedia.org/wiki/Rollover_(key)