java - JavaFX 使 imageView 朝着它所面对的方向前进
问题描述
我想让一个 imageView 对象移动到它所面对的方向。
我让它在 X/Y 轴上移动并让它旋转,但我真的不知道如何解决这个移动到它所面临的方向的问题(例如,在我的代码中我使用汽车,我只想让它朝其面对的方向移动)
我很感激任何我可以学习的想法或教程。
public class Main extends Application {
private static final double W = 800;
private static final double H = 600;
private boolean goNorth, goSouth, goWest, goEast;
private ImageView hero;
private int toAngle = 0;
@Override
public void start(Stage primaryStage) throws FileNotFoundException {
FileInputStream hero_image_input = new FileInputStream("C:\\Users\\A650262\\Desktop\\police-310208_1280.png");
Image hero_image = new Image(hero_image_input);
hero = new ImageView(hero_image);
hero.setFitHeight(120);
hero.setFitWidth(200);
BorderPane root = new BorderPane();
Scene scene = new Scene(root,800,800);
scene.setOnKeyPressed(new EventHandler<KeyEvent>(){
@Override
public void handle(KeyEvent event)
{
switch(event.getCode())
{
case UP: goNorth = true; break;
case DOWN: goSouth = true; break;
case LEFT: goWest = true; break;
case RIGHT: goEast = true; break;
}
}
});
scene.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event)
{
switch(event.getCode())
{
case UP: goNorth = false; break;
case DOWN: goSouth = false; break;
case LEFT: goWest = false; break;
case RIGHT: goEast = false; break;
}
}
});
root.getChildren().addAll(hero);
primaryStage.setScene(scene);
primaryStage.show();
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
int dx = 0, dy = 0;
if (goNorth) dy -= 5;
if (goSouth) dy += 5;
if (goEast) rotate(3);
if (goWest) rotate(-3);
moveHeroBy(dx, dy);
}
};
timer.start();
}
public static void main(String[] args) {
launch(args);
}
private void moveHeroBy(int dx, int dy) {
if (dx == 0 && dy == 0) return;
double x = dx + hero.getLayoutX();
double y = dy + hero.getLayoutY();
moveHeroTo(x,y);
}
private void moveHeroTo(double x, double y) {
hero.relocate(x, y);
System.out.println(hero.getNodeOrientation() + " " + hero.getEffectiveNodeOrientation());
}
public void rotate(int angle){
toAngle = toAngle + angle;
if (toAngle == 360)
{
toAngle = 0;
}
hero.setRotate(toAngle);
}
}
解决方案
使用Rotate
和Translate
变换来移动图像。这样,您可以使用 将Rotate
汽车最初面向的方向转换为当前方向。
private final Rotate rotate = new Rotate();
private final Translate translate = new Translate();
// upwards facing direction TODO: adjust
private final Point2D initialDirection = new Point2D(0, -1);
rotate.setPivotX(hero.getFitWidth() / 2);
rotate.setPivotY(hero.getFitHeight() / 2);
hero.getTransforms().addAll(translate, rotate);
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
double delta = 0;
if (goNorth) {
delta += 5;
}
if (goSouth) {
delta -= 5;
}
if (goEast) {
rotate(3);
}
if (goWest) {
rotate(-3);
}
Point2D pt = rotate.deltaTransform(initialDirection.multiply(delta));
moveHeroBy(pt.getX(), pt.getY());
}
};
private void moveHeroBy(double dx, double dy) {
if (dx == 0 && dy == 0) {
return;
}
double x = dx + translate.getX();
double y = dy + translate.getY();
translate.setX(x);
translate.setY(y);
}
public void rotate(int angle) {
angle += rotate.getAngle();
if (angle == 360) {
angle = 0;
}
rotate.setAngle(angle);
}
推荐阅读
- jquery - 将大量变量传递给 jQuery 中的函数
- reactjs - 在本机反应中设置状态值
- java - 我应该将 MongoDB 与实体的关系一起使用,以便在我的 Spring 5 项目中实现端到端的非阻塞吗?
- sql - 将字符串与 UNIQUEIDENTIFIER 进行比较?
- c# - 如何根据 AttributeID 字段获取动态控件类型
- c# - C# Interactive 可以显示计时信息吗?
- angular - 量角器等待角度应用稳定
- node.js - 异步回调中的摩卡测试
- android - kotlin 绑定类引用和泛型
- javascript - 如何在 javascript 中使用 fetch() 读取 JSON 文件?