私はいくつかの衝突検出を試みています。このテストでは、私は単純な矩形Shape
を使用しており、それらが衝突しているかどうかを調べるためにBound
をチェックしています。検出は期待通りには機能しませんが。私はオブジェクトを移動するさまざまな方法(再配置、setLayoutX、Y)と異なるバインドチェック(boundsInLocal、boundsInParrentなど)を試みたが、私はまだこれを動作させることができません。表示されているように、検出は1つのオブジェクトに対してのみ機能します.3つのオブジェクトがある場合でも、1つだけが衝突を検出します。これは、問題を実証するいくつかの作業コードです:あなたはルーチンあなたのcheckBoundsにわずかな論理エラーを持っているよう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;
}
}
JavaFXのさまざまな境界型の交差関係を示すために書いたこの[交差デモアプリケーション](https://gist.github.com/jewelsea/1441960)を試してみてください。 – jewelsea
それは私が今興味を持っているすべてのものがそのファイルのファーストクラスにあるように見えます。私が拾う重要なことの1つは、衝突をチェックするためのchangeListenerです。チェック(?)でLayoutBoundsも使用してください。私はsetLayoutXまたはtranslateXを長方形に使うべきですか?私はsetXを使っていますが、私は推測してプライベートだと思います。 – Giannis
追加の質問に答えるように更新されました。 – jewelsea