使用路径转换时无法响应冲突

时间:2014-12-05 02:11:55

标签: java javafx

我的目的是制作一个向目标射击球的游戏。但是,我更喜欢这个问题的一般答案。

Circle ball = new Circle(x1,y1,r);
Rectangle rect = new Rectangle(x2,y2,w,h);
Line path = new Line(x1,y1,x3,y3);

PathTransition pathTrans = new PathTransition(Duration.millis(t), path, ball);
pathTrans.play();

if (ball.getBoundsInParent().intersects(rect.getBoundsInParent())) 
{
  //foo
}

为什么程序没有发现碰撞?

如果需要澄清,我很乐意提供更多信息。

1 个答案:

答案 0 :(得分:2)

您正在开始动画后立即测试碰撞。除非两者在动画的开头相交,否则它将测试为假。

您需要在其中一个对象移动时重复测试。可能最好的方法是创建一个绑定到BooleanBinding属性的boundsInParent,并监听其值的变化:

BooleanBinding collision = Bindings.createBooleanBinding( () -> 
    ball.getBoundsInParent().intersects(rect.getBoundsInParent()),
    ball.boundsInParentProperty(),
    rect.boundsInParentProperty());

collision.addListener((obs, wasColliding, isNowColliding) -> {
    if (isNowColliding) {
        // foo
    }
});

(一种更天真的方法就是向ball.boundsInParentProperty()添加一个监听器,并向rect.boundsInParentProperty()添加一个监听器,并测试每个监听器中的冲突。但这会重复代码,我认为会效率低下。)