如何使用JavaFx使角色跳转?

如何使用JavaFx使角色跳转?,java,javafx,Java,Javafx,我想使用JavaFx使我的角色跳跃。 当我快速多次单击空格时,角色会快速下降并消失。 当我多次单击空格但速度较慢时,角色会按其应做的那样跳跃 我不确定问题出在哪里,但我认为这与AnimationTimer及其帧有关。 也许我用了一种错误的方式让我的角色跳跃,所以如果是这样,有人能给我正确的方式吗? 我必须使用JavaFx。 阿凡达:我角色的形象。 我用重力和动画定时器来做一个跳跃式的曲线 int gravity = 0; boolean left, right; window.getScene(

我想使用JavaFx使我的角色跳跃。 当我快速多次单击空格时,角色会快速下降并消失。 当我多次单击空格但速度较慢时,角色会按其应做的那样跳跃

我不确定问题出在哪里,但我认为这与AnimationTimer及其帧有关。 也许我用了一种错误的方式让我的角色跳跃,所以如果是这样,有人能给我正确的方式吗? 我必须使用JavaFx。
阿凡达:我角色的形象。 我用重力和动画定时器来做一个跳跃式的曲线

int gravity = 0;
boolean left, right;
window.getScene().setOnKeyPressed(ePress -> {
           KeyCode keycode = ePress.getCode();
           if(keycode.equals(keycode.D)){
               avatar.setTranslateX(avatar.getTranslateX() + 35);
               right = true;
           }
           if(keycode.equals(keycode.A)){
               avatar.setTranslateX(avatar.getTranslateX() - 35);
               left = true;
           }
           if(keycode.equals(keycode.W)){
               avatar.setTranslateY(avatar.getTranslateY() - 35);
           }
           if(keycode.equals(keycode.S)){
               avatar.setTranslateY(avatar.getTranslateY() + 35);
           }
           if(keycode.equals(keycode.SPACE)){
               double ypreviousPos = avatar.getTranslateY();
               jumpTimer = new AnimationTimer(){
                   @Override
                   public void handle(long now) {
                       avatar.setTranslateY(avatar.getTranslateY() - 10 + gravity);
                       gravity = gravity + 1;
                       if(ypreviousPos == avatar.getTranslateY()){
                             jumpTimer.stop();
                             gravity = 0;
                         }
                       if(right == true ){
                         avatar.setTranslateX(avatar.getTranslateX() + 10);
                         avatar.setTranslateY(avatar.getTranslateY() - 10 + gravity);
                         gravity = gravity + 1;
                         if(ypreviousPos == avatar.getTranslateY()){
                             jumpTimer.stop();
                             gravity = 0;
                         }
                       }  
                        if(left == true ){
                         avatar.setTranslateX(avatar.getTranslateX() - 10);
                         avatar.setTranslateY(avatar.getTranslateY() - 10 + gravity);
                         gravity = gravity + 1;
                         if(ypreviousPos == avatar.getTranslateY()){
                             jumpTimer.stop();
                             gravity = 0;
                         }
                       }
                   }

               };
                   jumpTimer.start();
           }                
        });

        window.getScene().setOnKeyReleased(eRel -> {
             KeyCode keycode = eRel.getCode();
           if(keycode.equals(keycode.D)){
               right = false;
           }
           if(keycode.equals(keycode.A)){
               left = false;
           }
        });
    });

如果已有一个
AnimationTimer
正在运行,则需要避免启动新的
AnimationTimer
:否则两个(或更多)的
AnimationTimer将同时修改
translateY
属性和
gravity
字段。因此,您可能会跳过开始位置,并且至少有一个动画计时器无法停止

替换

if(keycode.equals(keycode.SPACE))

应该有用

还要注意的是,测试浮点类型的相等性通常不是一个好主意。由于浮点运算中可能存在舍入错误,您可能永远无法获得预期的精确等式。(在这种情况下,我认为它会起作用,因为您只是将整数值添加到
double
;但是,无论如何,您应该遵循最佳实践。)您可能还应该替换

if(ypreviousPos == avatar.getTranslateY())


if(ypreviousPos)我觉得你可能缺少一对围绕“10+重力”的括号谢谢你的注释。我找到了答案。当我多次单击空格,角色仍然没有完成跳跃,因此AnimationTimer再次启动时,这就是问题的原因。我添加了一条逻辑语句,以确保AnimationTimer在角色完成跳跃之前不会再次启动。这意味着直到角色到达上一个位置Pos@HusseinAlbirouti这不是我在回答中所说的吗?“如果一个新的
AnimationTimer已经在运行,那么你需要避免启动一个新的
AnimationTimer
if(keycode.equals(keycode.SPACE)&&gravity==0)
不正是这样做的吗?
if(ypreviousPos == avatar.getTranslateY())
if(ypreviousPos <= avatar.getTranslateY())