2016-05-26 95 views
0

My KeyPressed正在工作,但是我的moveLeft方法没有改变avatarDX。我是否用moveLeft做错了什么?这看起来应该很简单,但我不确定我做错了什么。我没有任何错误消息。用KeyPressed在画布上移动图像

我在画布上绘制图像与

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

我希望得到任何帮助,我很新的在这。

+0

Java是按值调用的(http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value)。因此,改变方法参数的值不会修改任何内容,除了该“double”的本地副本。 – fabian

+0

你也考虑使用lambda表达式:'camera.setOnKeyPressed(event - > {...});' – pzaenger

回答

1

一个原因(可能有其他)程序没有按照你的预期行事,就是你正在试图通过while循环来控制你的头像。

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

取而代之,您需要使用callback来更新每个pulse上的场景。

我建议你用下面的办法:

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

谢谢你这是非常有帮助的。你给了我所需要的一切,以学习正确的方式来做到这一点。 :) – Yoozernaym