【问题标题】:A simple java game InputHandler issue一个简单的java游戏InputHandler问题
【发布时间】:2016-02-16 23:27:54
【问题描述】:

我的角色移动有问题。我只使用三个键。 VK_LEFT、VK_RIGHT 和 VK_SPACE。向右,向左移动并射击。所以我的问题是,当我按向左或向右箭头键时,当我按空格射击角色停止时,我必须释放移动键并再次按下它才能继续移动。我不想按下键。这怎么可能 ?这是我的来源:

公共类 PlayerInputHandler 扩展 InputHandler{

private Player player;

public PlayerInputHandler(Player player){
    super();
    this.player = player;
}

@Override
public void keyPressed(KeyEvent pressedKey) {
    int keyCode = pressedKey.getKeyCode();

    if(keyCode == KeyEvent.VK_RIGHT){
        this.player.setCurrentWidthPos(this.player.getCurrentWidthPos() + 5);
        this.player.setIsPlayerMovingRight(true);
    }
    if(keyCode == KeyEvent.VK_LEFT){
        this.player.setCurrentWidthPos(this.player.getCurrentWidthPos() - 5);
        this.player.setIsPlayerMovingLeft(true);
    }
    if(keyCode == KeyEvent.VK_SPACE){
        if(this.player.getIsPlayerMovingLeft() == false && this.player.getIsPlayerMovingRight() == false){
            this.player.shoot();
        }
    }
}

@Override
public void keyTyped(KeyEvent typedKey) {

}

@Override
public void keyReleased(KeyEvent releasedKey) {
    int keyCode = releasedKey.getKeyCode();

    if(keyCode == KeyEvent.VK_RIGHT){
        this.player.setIsPlayerMovingRight(false);
    }
    if(keyCode == KeyEvent.VK_LEFT){

            this.player.setIsPlayerMovingLeft(false);

    }
}

}

【问题讨论】:

  • 你在游戏的任何其他部分调用 setIsPlayerMovingLeft/Right() 吗?
  • 暂时不行,我只在我放在这里的代码中使用它。
  • 我测试了代码,我理解了这个问题。但是……另一个问题。你的游戏中有任何类型的游戏循环吗?游戏对象更新并渲染到屏幕的无限循环?
  • 是的,我在引擎类中有 while 循环。在它里面我调用了主要的渲染和更新方法。

标签: java keylistener


【解决方案1】:

我不是挥杆专家,但这就是正在发生的事情。当您按下单个按钮时,比如说右箭头键,您会不断收到新的 keyPressed 事件。当仍然按住右箭头然后按下空格键并释放它时,您会收到空格键的 keyPressed 和 keyReleased 事件,并且您不再从右箭头按钮获得任何 keyPressed 事件。为什么会这样?正如我所说,我不知道 Swing 的内部原理。

无论如何,这就是适合您的解决方案。我问你是否在你没有提供的代码中的其他地方有游戏循环,你有。您必须将玩家的位置更新移动到游戏循环的更新方法中。

更改按键监听器:

public void keyPressed(KeyEvent pressedKey) {
    int keyCode = pressedKey.getKeyCode();

    if(keyCode == KeyEvent.VK_RIGHT){
        this.player.setIsPlayerMovingRight(true);
    }
    if(keyCode == KeyEvent.VK_LEFT){
        this.player.setIsPlayerMovingLeft(true);
    }
    if(keyCode == KeyEvent.VK_SPACE){
        if(this.player.getIsPlayerMovingLeft() == false && this.player.getIsPlayerMovingRight() == false){
            this.player.shoot();
        }
    }
}

更改的内容:删除到位置更新调用:

this.player.setCurrentWidthPos()

然后,在你的游戏循环的更新方法中,你应该添加位置更新:

if(player.getIsPlayerMovingRight()) {
    player.setCurrentWidthPos(this.player.getCurrentWidthPos() + 5);
}

if(player.getIsPlayerMovingLeft()) {
    this.player.setCurrentWidthPos(this.player.getCurrentWidthPos() - 5);
}

【讨论】:

  • 是的,非常感谢,这很有意义,但我没有想到。它就像我现在想要的那样工作。
【解决方案2】:

你为什么会有这种情况?除非玩家不动,否则不允许开火。

if(this.player.getIsPlayerMovingLeft() == false && this.player.getIsPlayerMovingRight() == false){

【讨论】:

  • 因为我希望玩家只在他不动的时候进行射击。但无论如何,即使在这种情况下,我仍然遇到我描述的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
相关资源
最近更新 更多