我正在嘗試做一些碰撞檢測。對於這個測試,我使用簡單的長方形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