2017-04-11 1 views
0

Je suis en train de détecter la collision entre un objet et ImageView un rectangle dans JavaFX. Le code ci-dessous ne fonctionne pas et je ne sais pas pourquoi. Rien ne se passe lorsque les objets se chevauchent. Le fichier original de l'image est un png si cela fait une différence. L'objet imageview est déplacé avec des flèches et le rectangle se déplace également avec TranslateTranslation.Comment détecter une collision dans JavaFX entre le rectangle et l'objet imageview

public void collision(ImageView a, Rectangle b) { 
    if (a.getBoundsInLocal().intersects(b.getBoundsInLocal())) { 
     b.setY(-100); 
     score++; 
    } 
} 

imageview Code mouvement:

playg.setOnKeyPressed(new EventHandler<KeyEvent>(){ 
     public void handle(KeyEvent event) { 
      if(event.getCode() == KeyCode.RIGHT) { 
       basket.setLayoutX(basket.getLayoutX() + 15); 
       brect.setLayoutX(basket.getLayoutX() + 15); 

      } else if (event.getCode() == KeyCode.LEFT) { 
       basket.setLayoutX(basket.getLayoutX() - 15); 
       brect.setLayoutX(basket.getLayoutX() - 15); 
      } 
     } 
    }); 

rectangle Code d'animation:

TranslateTransition tt = new TranslateTransition(Duration.seconds(4), rect2); 
    tt.setByY(800f); 
    tt.setCycleCount(INDEFINITE); 
    tt.play(); 

Répondre

1

Essayez d'utiliser getBoundsInParent() au lieu de getBoundsInLocal().

Certains tests rapides ont montré que le BoundingBox ne changeait pas entre deux positions différentes lors de l'utilisation locale, mais l'a fait en utilisant un parent interne. Je devine que cela est dû au fait getBoundsInParent() utilise les transformations sur le nœud (voir le Javadoc entre les deux pour plus d'informations).

Cependant, je n'ai pas testé si cela affecte le résultat de la méthode d'intersection. Modifier: A décidé de faire plus de tests. Ajout de deux Rectangle s à un StackPane et déplacer un autour a montré que « local » toujours montré vrai et « parent » ne montrait vrai lorsque se croisent visuellement. En effet, en ce qui concerne le «local», les rectangles n'ont jamais quitté leur position de départ, ce qui signifie qu'ils se croisent techniquement à tout moment. Mais "en-parent" a montré leurs vraies positions au sein de la StackPane.

+0

J'ai essayé, mais il ne fonctionne toujours pas –

+0

Hmm ... Je changé un de mes rectangles à un 'ImageView' et encore travaillé pour moi (j'ai même utilisé un fichier .png). Même en regardant le nouveau code que vous avez posté, je ne suis pas très différent. Quand vérifiez-vous les collisions dans votre code? – Slaw

+0

En fait, j'ai découvert que la fonction n'est appelée qu'une seule fois, lorsque la fenêtre s'ouvre. Le getBoundInParent() a travaillé pour cela une fois, merci. Savez-vous comment obtenir le programme pour vérifier en permanence la collision? J'ai appelé la fonction une fois dans la méthode start() –