0

我的 KeyPressed 正在工作,但我的 moveLeft 方法中的 avatarDX 没有变化。我在 moveLeft 上做错了吗?看起来应该很简单,但我不确定我做错了什么。我没有任何错误消息。

我正在画布上绘制图像

gc.drawImage(avatar, avatarSX, avatarSY, avatarSW, avatarSH, avatarDX, avatarDY, avatarDW, avatarDH);

对于 KeyPressed 我有

canvas.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke) {
            double speed = 2;
            switch(ke.getCode()) {
                case A:
                    System.out.println("pressed a");
                    moveLeft(avatarDX, speed);
                    System.out.println(avatarDX);
                    break;
            }
        }
});

而 moveLeft 是

private void moveLeft(double avatarDX, double speed) {
            while (avatarDX > 0) {
                avatarDX -= speed;
            }
        }

我将不胜感激任何帮助,我对此很陌生。

4

1 回答 1

1

程序未按预期运行的一个原因(可能还有其他原因)是您试图通过 while 循环进行处理以控制您的化身。

这只会暂停 JavaFX 应用程序,直到循环完成,然后在循环结束时将屏幕更新到最终状态。JavaFX 不是即时绘图系统,它是一个保留的绘图系统,仅当您将 JavaFX 应用程序线程的控制权交还给 JavaFX 系统时才会呈现场景。

相反,您需要使用回调来更新每个脉冲的场景。

我建议您使用以下方法:

  1. 由于您是新手,请尝试使用 JavaFX 场景图而不是 Canvas 来编写应用程序。对于许多事情来说,对场景图进行编程更容易。如果在稍后阶段发现 Canvas 更合适,那么当您更好地了解 JavaFX 编程模型时,您始终可以转换为 Canvas。
  2. 查看这个使用按键在场景图中移动角色的示例。
  3. 不要试图循环移动你的角色。相反,要么使用内置的高级 JavaFX 动画工具,例如转换,或者(当这些工具不合适时,就像这里的情况一样),使用低级AnimationTimer接口。
  4. 阅读游戏循环和 JavaFX并将您在其中学到的知识应用到您的程序中。
于 2016-05-26T18:35:36.383 回答