如何使用JavaFx使我的角色跳跃?

时间:2018-03-06 13:54:46

标签: java javafx

我想使用JavaFx让我的角色跳跃。 当我快速点击 SPACE 多次时,角色迅速下降并消失。 当我单击 SPACE 很多次但速度较慢时,角色会按原样跳跃。

我不确定问题是什么,但我认为它与AnimationTimer及其框架有关。 也许我使用错误的方式让我的角色跳跃,所以如果是这样,有人能给我正确的方法吗? 我必须使用JavaFx 阿凡达:我的角色的形象。 我使用重力和AnimationTimer来制作像跳跃一样的曲线。

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;
           }
        });
    });

1 个答案:

答案 0 :(得分:2)

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

更换

if(keycode.equals(keycode.SPACE))

if(keycode.equals(keycode.SPACE) && gravity==0)

应该有用。

另请注意,测试浮点类型的相等性通常是个坏主意。由于浮点运算中可能出现舍入错误,因此您可能永远无法获得预期的精确相等性。 (在这种情况下,我认为它会起作用,因为你只是在double添加整数值;但是,你应该遵循最佳实践。)你应该也可以替换

if(ypreviousPos == avatar.getTranslateY())

if(ypreviousPos <= avatar.getTranslateY())

最后,您可能会考虑重构这一点,因此只有一个AnimationTimer,不断运行,只是安排您的密钥处理程序更改导致计时器跳转的值。