我想使用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;
}
});
});
答案 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
,不断运行,只是安排您的密钥处理程序更改导致计时器跳转的值。