Javafx
Jithel Messages postés 1049 Statut Membre -
Bonjour,
J'aimerais savoir comment faire pour créer une collision(prenons pour exemple un cercle c et un rectangle r), r peut se déplacer à l'aide de l'animation du clavier aT, j'aimerais, quand je déplace le cercle, que ce dernier ne puisse pas traverser le rectangle r (dans mon cas r est un mur car je fais un jeux 2D) merci de bien vouloir m'aider.
7 réponses
La problématique porte sur empêcher un cercle de traverser un rectangle lors d'un déplacement animé par clavier dans un jeu 2D en JavaFX, en utilisant Shape.intersect pour détecter les collisions. Des approches proposent Shape s = Shape.intersect(c, r3) et boolean collision = s.getBoundsInLocal().isEmpty() pour détecter une collision et bloquer le déplacement lorsque l’intersection existe dans le code. Des corrections portent sur la cohérence des tests sur les bords du rectangle, sur la syntaxe des conditions et sur la gestion du clavier (KeyCode) dans l’AnimationTimer, afin d’éviter les erreurs de logique. En pratique, l’ajout d’un flag de début de partie et d’un contrôle continu des collisions dans la boucle d’AnimationTimer peut réduire les détections fantômes et améliorer la robustesse du comportement.
-
Dans la fonction qui permet de gérer les événements claviers, il faut créer un filtre pour ce qui est de déplacer le cercle par rapport aux coordonnées futures de ce cercle. Si ces coordonnées rentrent en collision avec un rectangle alors ne rien faire (ou plutôt : si ces coordonnées ne rentrent pas en collision avec un rectangle, le déplacer).
Sans code, demande vague et donc réponse vague.
Poste du code Java dans les balises Java du forum (bouton <> dans le menu d'édition puis colle dans ton code dans les balises). -
Bonjour, merci de m'avoir répondu, j'avais déjà crée une animation de clavier aT, j'avais prévue de mettre dans la condition de collisions aT.stop();, mais cela ne marche pas, avez vous une solution? voici mon code de l'événement :
//Création animation clavier pour pouvoir déplacer le cercle c :
HashSet<KeyCode> tab = new HashSet<KeyCode>();
AnimationTimer aT = new AnimationTimer() {
public void handle(long l) {
for(KeyCode t: tab) {
if (c.getLayoutX() > 487){
c.setLayoutX(487);
}
if (c.getLayoutY() > 287){
c.setLayoutY(287);
}
if (c.getLayoutY() < -283){
c.setLayoutY(-283);
}
if (c.getLayoutX() < -483){
c.setLayoutX(- 483);
}
switch(t){
case Z :
c.setLayoutY(c.getLayoutY()-10);
break;
case S:
c.setLayoutY(c.getLayoutY()+10);
break;
case D:
c.setLayoutX(c.getLayoutX()+10);
break;
case Q:
c.setLayoutX(c.getLayoutX()-10);
break;
case ESCAPE:
r.setVisible(true);
exit.setVisible(true);
re.setVisible(true);
}
}
};
};
scene.setOnKeyPressed(e ->{
boolean wasEmpty = tab.isEmpty();
if(tab.add(e.getCode()) && wasEmpty)
aT.start();
});
scene.setOnKeyReleased(e ->{
if(tab.remove(e.getCode()) && tab.isEmpty())
aT.stop();
});
-
-
-
-
-
D'accord, merci de m'avoir répondu, pouvais vous me dire où faut-il mettre ce boolean exactement et comment faut-il faire svp car je suis entrain de faire un jeux en 2d et je débute en javafx.merci(je viens de penser, vu que je vais mettre beaucoup de composants qui font aufis de mur dans mon jeux , j'avais penser de mettre tous ces composants dans un tableau, est une bonne idée?
-
-
Pouvez vous m'aider svp, c'est une des dernières étapes de la création de mon jeux 2D, merci.
-
J'ai essayé mais cela ne marche pas, dans la condition, on accélère la vitesse et ce n'est pas cela que je recherche, je voudrais, que le cercle c ne puisse pas traverser le rectangle r3, j'ai déjà crée avant le code qui permet de déplacer le cercle c, j'ai penser, que, quand il y a collision, l'animation aT qui permet de déplacer le cercle s’arrête, mais le joueur ne pourra plus déplacer le cercle pour pouvoir se déplacer ailleurs, avez vous une idée?merci
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
La collision ne marche pas, le cercle traverse encore le rectangle, voici mon code, pouvez vous m'aider svp :
//Collisions :
Shape s = Shape.intersect(c,r3);
boolean collision = s.getBoundsInLocal().isEmpty();
//Création animation clavier pour pouvoir déplacer le cercle c :
HashSet<KeyCode> tab = new HashSet<KeyCode>();
AnimationTimer aT = new AnimationTimer() {
public void handle(long l) {
for(KeyCode t: tab) {
switch(t){
case Z :
c.setLayoutY(c.getLayoutY()-10);
break;
case S:
c.setLayoutY(c.getLayoutY()+10);
break;
case D:
c.setLayoutX(c.getLayoutX()+10);
break;
case Q:
c.setLayoutX(c.getLayoutX()-10);
break;
case ESCAPE:
r.setVisible(true);
exit.setVisible(true);
re.setVisible(true);
}
if(!collision) {
switch(t){
case Z :
c.setLayoutY(c.getLayoutY()-10);
break;
case S:
c.setLayoutY(c.getLayoutY()+10);
break;
case D:
c.setLayoutX(c.getLayoutX()+10);
break;
case Q:
c.setLayoutX(c.getLayoutX()-10);
break;
}
}
if (c.getLayoutX() > 496){
c.setLayoutX(496);
}
if (c.getLayoutY() > 295){
c.setLayoutY(295);
}
if (c.getLayoutY() < -292){
c.setLayoutY(-292);
}
if (c.getLayoutX() < -493){
c.setLayoutX(- 493);
}
};
};
};
scene.setOnKeyPressed(e ->{
boolean wasEmpty = tab.isEmpty();
if(tab.add(e.getCode()) && wasEmpty)
aT.start();
});
scene.setOnKeyReleased(e ->{
if(tab.remove(e.getCode()) && tab.isEmpty())
aT.stop();
});
-
Utilise les balises java stp pour insérer ton code.
if(!collision) { // cette ligne a été déplacée switch(t){ case Z : c.setLayoutY(c.getLayoutY()-10); break; case S: c.setLayoutY(c.getLayoutY()+10); break; case D: c.setLayoutX(c.getLayoutX()+10); break; case Q: c.setLayoutX(c.getLayoutX()-10); break; case ESCAPE: r.setVisible(true); exit.setVisible(true); re.setVisible(true); } switch(t){ case Z : c.setLayoutY(c.getLayoutY()-10); break; case S: c.setLayoutY(c.getLayoutY()+10); break; case D: c.setLayoutX(c.getLayoutX()+10); break; case Q: c.setLayoutX(c.getLayoutX()-10); break; } } -
-
-
Ce code tu le mets après :
Shape s = Shape.intersect(c,r3); boolean collision = s.getBoundsInLocal().isEmpty(); //Création animation clavier pour pouvoir déplacer le cercle c : HashSet<KeyCode> tab = new HashSet<KeyCode>(); AnimationTimer aT = new AnimationTimer() { public void handle(long l) { for(KeyCode t: tab) { -
-
-
Bonjour, comment faire pour quand il y a collision entre le cercle c et la line lr3, cela écrit dans la console "Coucou"???
-
Voici mon code, mais il ne marche pas , pouvez vous m'aider svp :
//Création animation clavier pour pouvoir déplacer le cercle c : HashSet<KeyCode> tab = new HashSet<KeyCode>(); AnimationTimer aT = new AnimationTimer() { Shape s = Shape.intersect(c,lr3); boolean collision = s.getBoundsInLocal().isEmpty(); public void handle(long l) { for(KeyCode t: tab) { switch(t){ case Z : c.setLayoutY(c.getLayoutY()-10); break; case S: c.setLayoutY(c.getLayoutY()+10); break; case D: c.setLayoutX(c.getLayoutX()+10); break; case Q: c.setLayoutX(c.getLayoutX()-10); break; case ESCAPE: r.setVisible(true); exit.setVisible(true); re.setVisible(true); if(collision ) { System.out.println("COucou"); } }-
-
J'ai juste oublier de mettre case ... Et un break a la fin , mais le problème est que je suis obligé de mettre le case et après un lettre, si je met case P, et que si j'appuis sur p et qu'il y a collision, il y aura écrit coucou dans la console, mais ce n'est pas cela que je cherche, j'ai écrit un code qui permet de déplacer le cercle , j'ai créé un rectangle r3 qui est un mur dans mon jeux, j'aimerais tout simplement que le joueur qui incarne le cercle ne puisse pas traverser la cercle , et que si il est rentré en collisions avec le rectangle , qu'il puisse aller ailleurs et qu'il ne reste pas bloqué.pouver vous m'aider svp car c'est presque la fin de mon jeux et j'aimerais bien le finir.merci
-
-
-
-