Java交换机案例延迟

Java交换机案例延迟,java,switch-statement,Java,Switch Statement,我正在编写一个2d小游戏。事实上,我正忙于跳跃功能。当我按下向上箭头键时,我想让我的播放器跳起来。我设法让他跳了起来,但至少延迟了一秒钟。对于其他操作(如向左或向右移动),此dealy不存在。你知道它是从哪里来的吗 跳跃的代码在keyReaction方法中 public class John<I> extends AbstractGame<I> { //lists List<ImageObject<I>> floor = new ArrayList

我正在编写一个2d小游戏。事实上,我正忙于跳跃功能。当我按下向上箭头键时,我想让我的播放器跳起来。我设法让他跳了起来,但至少延迟了一秒钟。对于其他操作(如向左或向右移动),此dealy不存在。你知道它是从哪里来的吗

跳跃的代码在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);
}
}
关键反应:

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

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

在你的跳跃高度方法中,你有

jump = true;
if(jumpHeight < 100){
  jumpHeight += 5;
  getPlayer().getPos().y -=5;
} else if (jumpHeight < 200){
  jumpHeight +=5;
  getPlayer().getPos().y +=5;
}
break;
jump=true;
如果(跳线高度<100){
跳跃高度+=5;
getPlayer().getPos().y-=5;
}否则,如果(跳线高度<200){
跳跃高度+=5;
getPlayer().getPos().y+=5;
}
打破

在第4行中,位置a-=5。可能还有另一种方法可以防止YPO低于0。然后你按下向上箭头,它被发送了40次(200/5),最终跳跃高度大于200,然后玩家才开始向上移动

这与switch语句无关。当你使用它时,没有神奇的延迟感谢你的回答。我的球员在跳跃前的位置是y=560。当向上箭头键激活时,播放机应移到屏幕的上方。我注释掉了doChecks()中的所有方法,以查看我的类中是否存在阻止玩家移动的其他方法。jumpheight是我在类文件顶部声明的一个变量。它应该从0开始,在+5步中计数,如果达到200,则重置。如果我删除它周围的“如果”,该功能会立即工作。如果我把一个类似于1==1的条件作为条件,它甚至有一个延迟。你能用“如果”和“没有”来发布你的代码吗?把它添加到我的StartPost中jumpheight变量的用途是什么它超过了40,但你从不重置它?
setOnKeyPressed((ev)->{
    logic.keyReaction(KeyCode.fromCode(ev.getCode().impl_getCode()));
    ev.consume();
        });

setOnKeyReleased((ev)->{
    logic.keyReactionReleased(KeyCode.fromCode(ev.getCode().impl_getCode()));
    ev.consume();
        });
jump = true;
if(jumpHeight < 100){
  jumpHeight += 5;
  getPlayer().getPos().y -=5;
} else if (jumpHeight < 200){
  jumpHeight +=5;
  getPlayer().getPos().y +=5;
}
break;