当前位置: 首页 > 知识库问答 >
问题:

在TimeLine中进行Javafx碰撞检测

钱季
2023-03-14

我使用时间线动画线,但我不能检测碰撞。这是一个简短的例子,我基本上是在尝试做什么。

    Line line = new Line(100, 200, 200, 200);
    Line line1= new Line(350,50,350,300);

    Timeline animation = new Timeline(
            new KeyFrame(Duration.seconds(1.5), new KeyValue(line.endXProperty(), 400))
    );
    animation.setCycleCount(1);
    animation.play();

    if(line.getBoundsInParent().intersects(line1.getBoundsInParent())){
        System.out.println("Collision!");
    }

    Pane root = new Pane(line);
    root.getChildren().add(line1);
    Scene scene = new Scene(root, 400, 400);
    primaryStage.setScene(scene);
    primaryStage.show();

我使用了我在堆栈溢出中找到的其他一些代码,方法,想法。就像下面这样:

    Bounds bounds = line.getLayoutBounds();
    Shape intersect = Shape.intersect(line, line1);

    boolean intersects = intersect.getBoundsInLocal().getWidth() != -1;

    System.out.println("Intersects: " + intersects);

    if(intersect.getBoundsInLocal().getWidth() != -1)
    {
        System.out.println("This object can overlap other the other object!");
        System.out.print("Collision detected!");
    }
    else
    {
        intersect.getBoundsInLocal().getWidth();
        System.out.print("Collision not detected!");
    }

以及此代码的一些变体。

任何想法都会有所帮助

共有1个答案

卫招
2023-03-14

在这种情况下,当< code>line.endX达到350时,就会发生“冲突”(线条第一次相交)。

因此,您可以简单地执行以下操作:

    BooleanBinding intersecting = line.endXProperty().greaterThanOrEqualTo(350);
    intersecting.addListener((obs, wasIntersecting, isNowIntersecting) -> {
        System.out.println("Collision!");
    });

即:

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.binding.BooleanBinding;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
import javafx.util.Duration;

public class AnimatedLine extends Application {

    @Override
    public void start(Stage primaryStage) {
        Line line = new Line(100, 200, 200, 200);
        Line line1= new Line(350,50,350,300);

        BooleanBinding intersecting = line.endXProperty().greaterThanOrEqualTo(350);
        intersecting.addListener((obs, wasIntersecting, isNowIntersecting) -> {
            System.out.println("Collision!");
        });

        Timeline animation = new Timeline(
                new KeyFrame(Duration.seconds(1.5), new KeyValue(line.endXProperty(), 400))
        );
        animation.setCycleCount(1);
        animation.play();


        Pane root = new Pane(line);
        root.getChildren().add(line1);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

一般来说,检测两个线段是否相交可能比一个水平一个垂直的情况要困难一点,但是你总是可以很容易地求解方程并做类似的事情。

 类似资料:
  • 如何让我的球从屏幕上的物体上反弹? 下图是一个很好的例子,说明一旦球碰到障碍物,程序应该如何工作。 我让球从墙上反弹,但剩下的是让它也从物体上反弹。谢谢你的帮助! 以下是源代码:

  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,这样代码会变得

  • 我是JavaFX的新手,在碰撞检测方面遇到了麻烦。我在一个八边形内有一个圆圈,我希望通过从墙壁上反弹来留在八边形内。目前,如果我在尝试移动圆圈时检查按键事件内部的碰撞,它往往会跳来跳去,但是,如果我将碰撞检查放在按键事件之外,则不会发生任何事情。目前,我的代码只检查与左右墙的碰撞。这是我的代码:

  • 我正在努力通过tiledmap实现一个碰撞检测系统。我有一个2d“口袋妖怪风格”的游戏,有一个平铺的地图渲染。具体来说,我的平铺地图中有一个“碰撞”层。我希望与播放器和其他实体进行交互的tmx文件。我的问题是,我如何将播放器sprite(扩展Sprite类)连接到tiledmap的“碰撞”层,并导致两者之间的碰撞。感谢任何建议。

  • 问题内容: 有人可以帮我了解JS中冲突检测的工作原理吗?我不能使用jQuery或gameQuery-已经使用了原型- 因此,我正在寻找非常简单的东西。不要求完整的解决方案,只需为我指明正确的方向。 假设有: 现在球正在移动(任何方向)。“ Someobject”(0-X)已经预先定义,其中有20-60个随机放置,如下所示: 我可以创建一个位置为“ someobject(X)”的数组,并在“球”移动