Java 开关盒延迟

Java switch case delay

我正在编写一个小型 2d 游戏。实际上我正忙于跳跃功能。当我按下向上箭头键时,我希望我的播放器跳起来。我设法让他跳了起来,但至少延迟了一秒钟。对于向左或向右移动等其他操作不存在此交易。你知道它来自哪里吗?

跳跃的代码在keyReaction方法中。

public class John<I> extends AbstractGame<I> {
//lists
List<ImageObject<I>> floor = new ArrayList<>();

//variables
double jumpHeight = 0;

//boolean
boolean jump = false;

//fix values
int blockHeight = 40;
int blockWidth = 40;

public John(double width, double height) {
    //getPlayer()
    super(new ImageObject<>("player.png", new Vertex(120, height - 200), new Vertex(0, 0)), width, height);

    //floor objects
    for(int i=0; i<getWidth(); i+=blockWidth)
        floor.add(new ImageObject<>("brick.png", new Vertex(i, getHeight() - blockHeight)));

    //add arrays to canvas
    getGOss().add(floor);
}

@Override
public void doChecks() {
    for(ImageObject<I> f:floor) {
        //gravity
        if(!(jump) && !(getPlayer().touches(f)))
            getPlayer().getMotion().y++;

        //stop y-motion on ground
        if(getPlayer().touches(f)){
            getPlayer().getPos().y = getHeight() - blockHeight - getPlayer().getHeight();
            getPlayer().getMotion().y = 0;}
    }
}

@Override
public boolean isStopped(){
    return false;
}

@Override
public void keyReaction(KeyCode keycode){
    switch (keycode) {
        //move left
        case LEFT_ARROW:
            getPlayer().getMotion().x = -2;
            break;
        case VK_A:
            getPlayer().getMotion().x = -2;
            break;
        //move right
        case RIGHT_ARROW:
            getPlayer().getMotion().x = 2;
            break;
        case VK_D:
            getPlayer().getMotion().x = 2;
            break;
        //jump
        case UP_ARROW:
            jump = true;
            if(jumpHeight < 100){
                jumpHeight += 5;
                getPlayer().getPos().y -=5;

            } else if (jumpHeight < 200){
                jumpHeight +=5;
                getPlayer().getPos().y +=5;
            }
            break;
        case VK_W:
            break;
        case SPACE:
            break;
    }
}

@Override
public void keyReactionReleased(KeyCode keycode){
    switch (keycode) {
        //move left
        case LEFT_ARROW:
            getPlayer().getMotion().x = 0;
            break;
        case VK_A:
            getPlayer().getMotion().x = 0;
            break;
        //move right
        case RIGHT_ARROW:
            getPlayer().getMotion().x = 0;
            break;
        case VK_D:
            getPlayer().getMotion().x = 0;
            break;
        //jump
        case UP_ARROW:
            jump = false;
            jumpHeight = 0;
            break;
        case VK_W:
            jump = false;
            break;
        case SPACE:
            break;
    }
}

//test main
public static void main(String[] args) {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(new SwingScreen(new John<>(1800, 600)));
    f.pack();
    f.setVisible(true);
}
}

感谢您的帮助。

带有 if 的代码:

case UP_ARROW:
    if(jumpHeight < 20){
        jumpHeight += 5;
        getPlayer().getPos().y = -5;

    } else if (jumpHeight < 40){
        jumpHeight +=5;
        getPlayer().getPos().y = 5;
    }
    break;

没有 if 的代码:

case UP_ARROW:
   getPlayer().getPos().y = -5;
   break;

关键反应:

setOnKeyPressed((ev)->{
    logic.keyReaction(KeyCode.fromCode(ev.getCode().impl_getCode()));
    ev.consume();
        });

setOnKeyReleased((ev)->{
    logic.keyReactionReleased(KeyCode.fromCode(ev.getCode().impl_getCode()));
    ev.consume();
        });

在你的 jumpheight 方法中你有

jump = true;
if(jumpHeight < 100){
  jumpHeight += 5;
  getPlayer().getPos().y -=5;
} else if (jumpHeight < 200){
  jumpHeight +=5;
  getPlayer().getPos().y +=5;
}
break;

在第 4 行,pos 有一个 -=5。可能还有另一种方法可以防止 ypos 低于 0。然后你按下向上箭头,它被发送 40 次(200/5),最终 jumpheight 大于 200,然后玩家才开始向上。