我正在做一个JavaFX应用程序,我有一个多个形状(圆形和矩形)的板添加到窗格。我不希望圆圈在矩形上移动。
允许使用鼠标事件(OnMousePressed,Dragged,Released)拖动圆圈,而不允许移动矩形。
我正在使用此代码来检测我的圆圈何时与矩形碰撞。
private void checkIntersection(Shape block) {
boolean collisionDetected = false;
for (Shape static_bloc : nodes) {
if (static_bloc != block) {
Shape intersect = Shape.intersect(block, static_bloc);
if (intersect.getBoundsInLocal().getWidth() != -1) {
collisionDetected = true;
}
}
}
if (collisionDetected) {
System.out.println("Collision detected");
} else {
System.out.println("Collision non deteted");
}
}
我需要做的是在拖动圆圈时无法拖动矩形。我不想将形状发回到他的初始位置。 有没有办法用相交来做这件事还是我错过了什么?
答案 0 :(得分:1)
回答并不容易。你可以有一个类GameObject。这个类包含你的Shape。在这个GameObject类中,你有拖放逻辑。然后你将有一个类GameObjectManager,它包含所有GameObjects的列表。 GameObject的每个实例都会引用这个GameObjectManager,因此也知道所有GameObjects。因此,在移动逻辑中,您可以检查特定GameObject类型之间是否存在某些冲突,以及是否可以停止移动。
对于碰撞评估类,GameObject包含如下方法:
protected boolean isInCollision() {
for (GameObject gameObject : gameObjectManager.getAllGameObjects()) {
if (!gameObject.equals(this)) {
if (getView().getBoundsInParent().intersects(gameObject.getView().getBoundsInParent())) {
return true;
}
}
}
return false;
}
在您的情况下,您需要在此isInCollision方法中循环某些类型的对象。
答案 1 :(得分:0)
只想分享我的解决方案。
我想在移动完成之前检查节点 。因此,我修改了先前的解决方案,以创建以下解决方案。
节点类:我正在使用扩展Node
的自定义Label
类。这里使用的方法是从Label
继承的方法。
private boolean hasNoCollision(Node dragged, double x, double y) {
// For each node
for (Node n : nodes) {
// If it is not the same, and future position overlaps
if (!n.equals(dragged) &&
n.getBoundsInParent().intersects(x, y, dragged.getWidth(), dragged.getHeight())) {
// Then prevent collission
return false;
}
}
// Otherwise all is good!
return true;
}