使用 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。
我建议您使用以下方法:
- 由于您是新手,请尝试使用 JavaFX 场景图而不是 Canvas 编写应用程序。对场景图进行编程对于很多事情来说更容易。如果在稍后阶段,您发现 Canvas 更合适,那么当您更好地理解 JavaFX 编程模型时,您可以随时转换为 Canvas。
- Review this sample 使用按键在场景图中移动角色。
- 不要试图循环移动你的角色。相反,要么使用内置的 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 界面。
- 阅读 game loops and JavaFX 并将您在那里学到的知识应用到您的程序中。
我的 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。
我建议您使用以下方法:
- 由于您是新手,请尝试使用 JavaFX 场景图而不是 Canvas 编写应用程序。对场景图进行编程对于很多事情来说更容易。如果在稍后阶段,您发现 Canvas 更合适,那么当您更好地理解 JavaFX 编程模型时,您可以随时转换为 Canvas。
- Review this sample 使用按键在场景图中移动角色。
- 不要试图循环移动你的角色。相反,要么使用内置的 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 界面。
- 阅读 game loops and JavaFX 并将您在那里学到的知识应用到您的程序中。