当前位置: 首页 > 知识库问答 >
问题:

如何使用JavaFx让角色跳跃?

李招
2023-03-14

我想用JavaFx让我的角色跳跃。当我快速点击空格多次时,角色会迅速掉落并消失。当我多次单击空格,但速度较慢时,角色会按其应有的方式跳跃。

我不确定问题出在哪里,但我认为这与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个答案

诸葛嘉熙
2023-03-14

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

替换

if(keycode.equals(keycode.SPACE))

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

应该有用。

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

if(ypreviousPos == avatar.getTranslateY())

具有

if(ypreviousPos <= avatar.getTranslateY())

最后,您可以考虑对其进行重构,以便只有一个AnimationTimer,持续运行,只需安排密钥处理程序更改导致计时器跳转的值即可。

 类似资料:
  • 您可以按照贵公司实际职责来设计角色,实现各司其职的安排。例如:如果贵公司设有财务专员这一职位专职负责支付,您可以设计一个充值专员的角色,为角色配置充值权限,从而实现专人专岗负责。

  • 我在libgdx/java使用Box2d的RPG 2d中工作。 我有主角和其他三个追随者。我希望他们像蛇一样沿着主人公的路线走(与Master System/Phantasy Star和其他旧RPG一样),以免在发现狭窄的入口时搞砸。 在我的PlayScreen课程中,我分别调用所有角色。 在屏幕上 HandleInput(浮点dt)方法我只移动主字符 更新(浮点dt)方法 渲染(浮动增量)方法

  • 问题内容: 我想使用Spring Security JSP标签库根据角色有条件地显示一些内容。但是在Spring Security 3.1.x中,仅检查一个角色。 我可以使用,但 ifAllGranted 已弃用。 有什么帮助吗? 问题答案: 春季安全性中有一个特殊的安全性表达: hasAnyRole(角色列表) -如果已授予用户指定的任何角色(以逗号分隔的字符串 列表形式) ,则为true。 我

  • 我正在使用Spring Security 3.2.3。释放 这是我的WebSecurityConfigrerAdapter的代码 结果是:HTTP状态403-访问被拒绝 但是如果我评论这一行: 一切正常。这意味着(我猜)我的角色或HttpSecurity有问题。 所以我开始调试。我仔细检查我的用户详细信息是否有两个具有名称的授权:ADMIN、USER。 你知道是什么导致了这个问题吗?

  • 本文向大家介绍ansible 使用角色,包括了ansible 使用角色的使用技巧和注意事项,需要的朋友参考一下 示例 Ansible使用角色的概念来更好地允许模块化代码并避免重复自己。 角色只是Ansible知道从何处加载vars文件,任务和处理程序的文件夹结构。一个例子可能看起来像这样: 然后,您可以将该角色用于基本的剧本,如下所示: 针对此剧本运行Ansible时,它将针对组中的所有主机并针对

  • 我设置了一个日志频道,这样如果用户删除了一条消息,它就会被发送到该频道,这样我的版主和我自己就可以看到删除的消息。 我想这样做,这样就不会发送一个嵌入式显示什么我的版主或我自己删除,以避免混乱。有办法做到这一点吗?