我的目的是制作一个向目标射击球的游戏。但是,我更喜欢这个问题的一般答案。
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
}
为什么程序没有发现碰撞?
如果需要澄清,我很乐意提供更多信息。
答案 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()
添加一个监听器,并测试每个监听器中的冲突。但这会重复代码,我认为会效率低下。)