0

0

获取JavaFX时间轴动画中移动对象的坐标

花韻仙語

花韻仙語

发布时间:2025-10-01 20:33:19

|

394人浏览过

|

来源于php中文网

原创

获取javafx时间轴动画中移动对象的坐标

本文介绍了如何在JavaFX游戏中获取时间轴动画中移动对象的实时坐标。通过getBoundsInParent()方法,可以获取节点相对于其父节点的边界信息,从而提取到考虑了所有变换(包括时间轴动画产生的位移)后的中心点坐标,方便实现激光射击等精确瞄准效果。

在JavaFX应用中,尤其是游戏开发中,经常需要获取动画对象的实时坐标,以便进行碰撞检测、目标跟踪或精确的视觉效果控制。当对象的位置由Timeline动画驱动时,直接从Timeline中获取坐标可能比较困难。本文将介绍一种简便的方法,通过Node类的getBoundsInParent()方法获取对象的实时坐标。

使用 getBoundsInParent() 获取坐标

getBoundsInParent()方法返回节点在其父坐标系中的边界(Bounds)。这个边界对象包含了节点的位置和尺寸信息,并且已经考虑了节点的所有变换,包括平移(translate)、旋转(rotate)、缩放(scale)等。因此,即使节点的位置是由Timeline动画改变的,getBoundsInParent()也能返回其当前的准确位置。

以下是如何使用getBoundsInParent()获取对象中心点坐标的示例代码:

立即学习Java免费学习笔记(深入)”;

ONLYOFFICE
ONLYOFFICE

用ONLYOFFICE管理你的网络私人办公室

下载
import javafx.scene.Node;
import javafx.geometry.Bounds;

public class CoordinateGetter {

    public static void main(String[] args) {
        // 假设 word.getWordBox() 返回一个 JavaFX Node 对象
        Node wordBox = // ... 获取你的 wordBox 对象

        // 获取 wordBox 在父容器中的边界
        Bounds bounds = wordBox.getBoundsInParent();

        // 从边界中提取中心点坐标
        double x = bounds.getCenterX();
        double y = bounds.getCenterY();

        System.out.println("WordBox 的中心点坐标:x = " + x + ", y = " + y);
    }
}

代码解释:

  1. wordBox.getBoundsInParent(): 这一步获取wordBox节点在其父节点坐标系中的边界。返回的Bounds对象包含了wordBox的最小包围矩形,其坐标是相对于wordBox的父节点的。
  2. bounds.getCenterX()bounds.getCenterY(): 这两个方法分别返回边界矩形的中心点X坐标和Y坐标。由于bounds是相对于父节点的,因此这两个坐标也是wordBox中心点相对于父节点的坐标。

示例:结合时间轴动画

假设你有一个Timeline动画,用于改变一个Rectangle的位置,你可以这样获取它的实时坐标:

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;
import javafx.geometry.Bounds;

import java.util.Random;

public class TimelineCoordinateExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        Pane root = new Pane();
        Rectangle rect = new Rectangle(50, 50, Color.RED);
        root.getChildren().add(rect);

        Random rand = new Random();
        int wordTime = 1000; // 动画持续时间

        Timeline timeline = new Timeline();
        timeline.getKeyFrames().addAll(
                new KeyFrame(Duration.millis(wordTime),
                        new KeyValue(rect.translateXProperty(), rand.nextInt(100, 500))),
                new KeyFrame(Duration.millis(wordTime),
                        new KeyValue(rect.translateYProperty(), rand.nextInt(0, 150)))
        );
        timeline.setCycleCount(Timeline.INDEFINITE); // 无限循环
        timeline.play();

        // 定时获取坐标 (例如每秒一次)
        Timeline coordinateUpdateTimeline = new Timeline(
                new KeyFrame(Duration.seconds(1), event -> {
                    Bounds bounds = rect.getBoundsInParent();
                    double x = bounds.getCenterX();
                    double y = bounds.getCenterY();
                    System.out.println("Rectangle 的中心点坐标:x = " + x + ", y = " + y);
                })
        );
        coordinateUpdateTimeline.setCycleCount(Timeline.INDEFINITE);
        coordinateUpdateTimeline.play();

        Scene scene = new Scene(root, 600, 400);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Timeline Coordinate Example");
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

在这个例子中,Rectangle的位置由Timeline动画控制。另一个Timeline (coordinateUpdateTimeline) 每秒钟获取一次Rectangle的中心点坐标并打印到控制台。 你会发现打印的坐标随着动画的进行而变化。

注意事项

  • 确保在JavaFX应用程序线程中调用getBoundsInParent(),以避免线程安全问题。
  • getBoundsInParent()返回的坐标是相对于节点的父节点的。如果需要相对于场景的坐标,可以使用localToScene()方法进行转换。
  • 如果节点没有添加到场景图中,getBoundsInParent()可能返回不正确的结果。

总结

getBoundsInParent()方法提供了一种简单而有效的方式来获取JavaFX节点在时间轴动画中的实时坐标。通过获取节点的边界信息,可以轻松地提取到节点的中心点坐标,从而方便地实现各种复杂的动画效果和交互逻辑。在开发JavaFX游戏或需要精确控制对象位置的应用中,这是一个非常有用的技巧。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

52

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

54

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

15

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

125

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

138

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.7万人学习

C# 教程
C# 教程

共94课时 | 7.1万人学习

Java 教程
Java 教程

共578课时 | 48.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号