提前道歉。我是自学成才,只学了一个月。
这是我用WASD键移动的窗口中的一个简单矩形。
public LinkedList<Object> object;
public KeyInput(LinkedList<Object> object){
this.object = object;
}
public void keyPressed(KeyEvent e){
int key = e.getKeyCode();
Object myPlayer = Main.object.get(0);
if(myPlayer.getName() == "PlayerOne"){
if(key == KeyEvent.VK_W)
myPlayer.setVelocityY(myPlayer.getVelocityY() - 5);
if(key == KeyEvent.VK_S)
myPlayer.setVelocityY(myPlayer.getVelocityY() + 5);
if(key == KeyEvent.VK_D)
myPlayer.setVelocityX(myPlayer.getVelocityX() + 5);
if(key == KeyEvent.VK_A)
myPlayer.setVelocityX(myPlayer.getVelocityX() - 5);
}
if(key == KeyEvent.VK_ESCAPE) System.exit(0);
}
public void keyReleased(KeyEvent e){
int key = e.getKeyCode();
Object tempObject = Main.object.get(0);
if(tempObject.getName() == "PlayerOne"){
if(key == KeyEvent.VK_W)
tempObject.setVelocityY(tempObject.getVelocityY() + 5);
if(key == KeyEvent.VK_S)
tempObject.setVelocityY(tempObject.getVelocityY() - 5);
if(key == KeyEvent.VK_D)
tempObject.setVelocityX(tempObject.getVelocityX() - 5);
if(key == KeyEvent.VK_A)
tempObject.setVelocityX(tempObject.getVelocityX() + 5);
}
}
/////////////////////////////////////////////// //////////////
public void setVelocityX(int velocityX){
this.velocityX = velocityX;
//Prevent a speed higher than 5.
if(this.velocityX > 5) this.velocityX = 5;
if(this.velocityX < -5) this.velocityX = -5;
}
public void setVelocityY(int velocityY){
this.velocityY = velocityY;
if(this.velocityY > 5) this.velocityY = 5;
if(this.velocityY < -5) this.velocityY = -5;}
运动完全符合我的预期。按键之间没有延迟,运动平稳,对角线运动起作用。 问题是...... 如果我按住,则播放器按预期向上移动。然后我按住DOWN ..然后玩家将按照预期向下移动。但是当我释放DOWN时,即使我从未放过,玩家也不会向上移动。 然后,当我最终释放UP时,玩家一直移动到 底部。 谢谢。
如果按下了键,是不是更新了getVelocity? 根据数学计算,保持将velocityX设置为-5。然后按住向velocityX添加+5。因此将其设为0.但是无论如何球员都会向下移动。 我一直试图解决这个问题10个小时。任何帮助都会很棒。
答案 0 :(得分:0)
keyPressed
的问题在于,只要保持按下,就会为给定的密钥发送许多事件。
如果最后一个用于相同的按键,则可以忽略该事件。
在您的课程中,您可以声明一些int
来存储最后一个键的值:
private int lastKey = 0;
然后以这种方式使用它(参见代码中的注释):
public void keyPressed(KeyEvent e){
int key = e.getKeyCode();
// if last key was the same one, ignore :
if (key == lastKey) {
return;
}
Object myPlayer = Main.object.get(0);
if(myPlayer.getName().equals("PlayerOne")){
if(key == KeyEvent.VK_W)
myPlayer.setVelocityY(myPlayer.getVelocityY() - 5);
if(key == KeyEvent.VK_S)
myPlayer.setVelocityY(myPlayer.getVelocityY() + 5);
if(key == KeyEvent.VK_D)
myPlayer.setVelocityX(myPlayer.getVelocityX() + 5);
if(key == KeyEvent.VK_A)
myPlayer.setVelocityX(myPlayer.getVelocityX() - 5);
}
// set the current key as the last key
lastKey = key;
if(key == KeyEvent.VK_ESCAPE) System.exit(0);
}
此外,此示例中已修复String
comparison。