我正在尝试做一些碰撞检测。对于这个测试,我使用简单的长方形Shape
,并检查他们的Bound
,以确定它们是否发生碰撞。虽然检测不能按预期工作。我尝试过使用不同的方法来移动对象(relocate,setLayoutX,Y),还有不同的绑定检查(boundsInLocal,boundsInParrent等),但我仍然无法得到这个工作。正如你所看到的,检测只适用于一个物体,即使你有三个物体只有一个物体检测到碰撞。这是一些工作的代码演示问题:检查形状与JavaFX的碰撞
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import java.util.ArrayList;
public class CollisionTester extends Application {
private ArrayList<Rectangle> rectangleArrayList;
public static void main(String[] args) {
launch(args);
}
public void start(Stage primaryStage) {
primaryStage.setTitle("The test");
Group root = new Group();
Scene scene = new Scene(root, 400, 400);
rectangleArrayList = new ArrayList<Rectangle>();
rectangleArrayList.add(new Rectangle(30.0, 30.0, Color.GREEN));
rectangleArrayList.add(new Rectangle(30.0, 30.0, Color.RED));
rectangleArrayList.add(new Rectangle(30.0, 30.0, Color.CYAN));
for(Rectangle block : rectangleArrayList){
setDragListeners(block);
}
root.getChildren().addAll(rectangleArrayList);
primaryStage.setScene(scene);
primaryStage.show();
}
public void setDragListeners(final Rectangle block) {
final Delta dragDelta = new Delta();
block.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
// record a delta distance for the drag and drop operation.
dragDelta.x = block.getTranslateX() - mouseEvent.getSceneX();
dragDelta.y = block.getTranslateY() - mouseEvent.getSceneY();
block.setCursor(Cursor.NONE);
}
});
block.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
block.setCursor(Cursor.HAND);
}
});
block.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
block.setTranslateX(mouseEvent.getSceneX() + dragDelta.x);
block.setTranslateY(mouseEvent.getSceneY() + dragDelta.y);
checkBounds(block);
}
});
}
private void checkBounds(Rectangle block) {
for (Rectangle static_bloc : rectangleArrayList)
if (static_bloc != block) {
if (block.getBoundsInParent().intersects(static_bloc.getBoundsInParent())) {
block.setFill(Color.BLUE); //collision
} else {
block.setFill(Color.GREEN); //no collision
}
} else {
block.setFill(Color.GREEN); //no collision -same block
}
}
class Delta {
double x, y;
}
}
试着玩弄我写的这个[intersection demo application](https://gist.github.com/jewelsea/1441960)来演示JavaFX中各种边界类型的交集关系。 – jewelsea 2013-02-21 23:11:47
好吧,看起来我现在感兴趣的所有内容都在该文件的第一课。我选择的一件重要事情是用于检查冲突的changeListener。在检查上也使用LayoutBounds(??)。我应该使用setLayoutX还是translateX作为矩形?我看到你正在使用setX,但那是私人的,我猜测,在doc上它不清楚哪一个是改变相同属性的公共方法。 – Giannis 2013-02-21 23:34:23
更新回答解决其他问题。 – jewelsea 2013-02-22 00:58:05