2015-06-08 9 views
0

Я использую библиотеку JavaFx 8.Проблема столкновения javafx между дорожкой (строкой) с толстым штрихом и окружением

Моя задача проста: я хочу проверить, сталкивается ли круг с дорогой, которая имеет толстый ход вокруг него. Проблема в том, что обе функции Path.intersect() и Shape.intersect() игнорируют ход вокруг пути/линии.

Path tempPath = new Path(player.getPath().getElements()); 
//player.getDot() is Circle 
if(tempPath.intersects(player.getDot().getBoundsInParent())){ 
    Shape intersect = Shape.intersect(tempPath, player.getDot()); 
    if(intersect.getBoundsInLocal().getWidth() != -1){ 
     System.out.println("Path Collision occurred"); 
    } 
} 

Мой путь сделан из многих объектов LineTo. Формат таков:

/** Creates path and player dot */ 
private void createPath() { 
    this.path = new Path(); 
    this.path.setStrokeWidth(20); 
    this.path.setStroke(Color.RED); 
    this.path.setStrokeLineCap(StrokeLineCap.ROUND); 
    this.path.setStrokeLineJoin(StrokeLineJoin.ROUND); 

    this.dot = new Circle(10, Color.BLUE); 
    this.dot.setOpacity(1); 
} 

Как я мог осуществить успешное обнаружение столкновения?

ответ

1

Обнаружение столкновений работает просто отлично:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.ClosePath; 
import javafx.scene.shape.LineTo; 
import javafx.scene.shape.MoveTo; 
import javafx.scene.shape.Path; 
import javafx.scene.shape.Shape; 
import javafx.scene.shape.StrokeLineCap; 
import javafx.scene.shape.StrokeLineJoin; 
import javafx.stage.Stage; 

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 

     BorderPane root = new BorderPane(); 

     Circle circle = new Circle(100, 100, 30); 
     Path path = new Path(); 

     double x = 144; 

     path.getElements().add(new MoveTo(x, 140)); 
     path.getElements().add(new LineTo(500, 100)); 
     path.getElements().add(new ClosePath()); 

     path.setStrokeWidth(60); 
     path.setStrokeLineCap(StrokeLineCap.ROUND); 
     path.setStrokeLineJoin(StrokeLineJoin.ROUND); 

     Shape shape = Shape.intersect(circle, path); 

     boolean intersects = shape.getBoundsInLocal().getWidth() != -1; 

     System.out.println("Intersects: " + intersects); 

     Pane pane = new Pane(); 
     pane.getChildren().addAll(circle, path); 
     root.setCenter(pane); 

     Scene scene = new Scene(root, 800, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

переключателя х = 144 с й = 145 для тестирования. Консоль показывает, есть ли пересечение или нет.

Проблема в том, что вы сравниваете разные границы.

См. Документацию по адресу Node, раздел «Ограничительные прямоугольники» о том, как рассчитываются различные оценки.

+0

Вы правы, столкновение отлично работает. Я узнал, что моя ошибка была в дублировании объекта Path. Путь tempPath = new Path (player.getPath(). GetElements());) Свойства старого пути, такие как Stroke and Color, не были перенесены на новый. поэтому необходимо переназначить свойства. –

 Смежные вопросы

  • Нет связанных вопросов^_^