使用KeyPressed在Canvas上移动图像

时间:2016-05-26 18:17:49

标签: java javafx java-canvas

我的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;
            }
        }

我很感激我在这方面的任何帮助。

1 个答案:

答案 0 :(得分:1)

该程序没有按预期行事的原因(可能有其他原因)是您尝试通过while循环处理以控制您的头像。

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

相反,您需要使用callback更新每个pulse上的场景。

我建议你使用以下方法:

  1. 当您是新手时,尝试使用JavaFX场景图而不是Canvas编写应用程序。对许多事情来说,对场景图进行编程简单易行。如果您在稍后阶段发现Canvas更适合,那么当您更好地理解JavaFX编程模型时,您可以随时转换为Canvas。
  2. Review this sample使用按键在场景图中移动角色。
  3. 不要试图循环移动你的角色。相反,要么使用内置的high level JavaFX animation facilities,例如转换,要么(当这些不适合时,就像这里的情况一样),使用低级AnimationTimer接口。
  4. 阅读game loops and JavaFX并将您在那里学到的知识应用到您的计划中。