gpt4 book ai didi

java - KeyListener 事件的短暂延迟

转载 作者:行者123 更新时间:2023-12-02 13:01:34 29 4
gpt4 key购买 nike

我正在编写一个小游戏。到目前为止,我有一个玩家,他可以在 2D 打印的瓷砖世界中跟随玩家移动。这里有一个小preview .

现在我的玩家移动代码如下所示:

KeyListener 类

public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
for(int i = 0; i < handler.object.size(); i++){
GameObject tempObject = handler.object.get(i);

if(tempObject.getId() == ID.Player){
if(key == KeyEvent.VK_D) tempObject.setVelX(5);
if(key == KeyEvent.VK_A) tempObject.setVelX(-5);
if(key == KeyEvent.VK_SPACE && Var.jump == true) {
tempObject.setVelY(-10);
Var.jump = false;
}
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();

for(int i = 0; i < handler.object.size(); i++){
GameObject tempObject = handler.object.get(i);

if(tempObject.getId() == ID.Player){
if(key == KeyEvent.VK_D) tempObject.setVelX(0);
if(key == KeyEvent.VK_A) tempObject.setVelX(0);
}
}

玩家等级

public void tick() {
if (Var.falling == true) {
velY += Var.gravity;
if (velY > 10) {
velY = 10;
}
}
x += velX;
y += velY;

这些代码只是类的一部分。

问题

当我用 A 或 D 向右或向左移动,然后以某种方式点击另一个键(从 a 到 d/从 d 到 a)时,我的角色会静止一小会儿,然后在短暂的延迟后移动。请参阅here .

最佳答案

  1. 用户按下 D,这会触发对 keyPressed 的调用,后者会调用 tempObject.setVelX(5)
  2. 用户释放 A,这会触发对 keyReleased 的调用,后者会调用 tempObject.setVelX(0)。这会停止你的角色的 Action 。
  3. 用户仍然按住 D,因此短暂延迟后,该键的自动重复会触发对 keyPressed 的另一次调用,从而导致 tempObject.setVelX(5) 再次被调用,导致角色再次开始移动。

除非没有按下移动键,否则不应调用tempObject.setVelX(0)

你如何确定这一点?您需要定义跟踪它们的实例字段。例如:

private boolean leftPressed;
private boolean rightPressed;

// ...

public void keyPressed(KeyEvent e) {
//...

if (key == KeyEvent.VK_D) {
rightPressed = true;
tempObject.setVelX(5);
}
if (key == KeyEvent.VK_A) {
leftPressed = true;
tempObject.setVelX(-5);
}

//...
}

public void keyReleased(KeyEvent e) {
//...

if (key == KeyEvent.VK_D) {
rightPressed = false;
if (!leftPressed) {
tempObject.setVelX(0);
}
}
if (key == KeyEvent.VK_A) {
leftPressed = false;
if (!rightPressed) {
tempObject.setVelX(0);
}
}

//...
}

一些旁注:

  • gameObject 是一个比 tempObject 更好的变量名称。
  • 你永远不应该写“booleanVariable == true”。相反,只需编写booleanVariable。这样可以通过写入一个“=”而不是两个来避免意外赋值的可能性。例如:
    if (Var.falling) {

更简单地说:从代码中删除所有出现的 == true

关于java - KeyListener 事件的短暂延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44285402/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com