使用 KeyPressed 在 Canvas 上移动图像

Moving an Image on Canvas with KeyPressed

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

我正在使用

在 canvas 上绘制图像
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;
            }
        }

我将不胜感激任何帮助,我是这方面的新手。

程序没有按您预期的那样运行的一个原因(可能还有其他原因)是您试图通过一个 while 循环来控制您的化身。

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

相反,您需要使用 callback to update the scene on each pulse

我建议您使用以下方法:

  1. 由于您是新手,请尝试使用 JavaFX 场景图而不是 Canvas 编写应用程序。对场景图进行编程对于很多事情来说更容易。如果在稍后阶段,您发现 Canvas 更合适,那么当您更好地理解 JavaFX 编程模型时,您可以随时转换为 Canvas。
  2. Review this sample 使用按键在场景图中移动角色。
  3. 不要试图循环移动你的角色。相反,要么使用内置的 high level JavaFX animation facilities such as transitions, or (when those aren't a good fit, as is likely the case here), use the low level AnimationTimer 界面。
  4. 阅读 game loops and JavaFX 并将您在那里学到的知识应用到您的程序中。