Menu

Javafx

Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
- - Dernière réponse : Jithel
Messages postés
825
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 mars 2019
- 14 mars 2019 à 20:28
Bonjour,
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.



Configuration: Windows / Chrome 72.0.3626.119
Afficher la suite 

Votre réponse

7 réponses

Messages postés
825
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 mars 2019
60
0
Merci
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).
Commenter la réponse de Jithel
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
0
Merci
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();
});

ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
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?
Jithel
Messages postés
825
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 mars 2019
60 > ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-

boolean collision = s.getBoundsInLocal().isEmpty();

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;

   case ESCAPE:
   r.setVisible(true);
   exit.setVisible(true);
   re.setVisible(true);
ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Bonjour, merci de m'avoir répondu mais le cercle c traverse le rectangle r3, donc il n'y a pas de collision.
Jithel
Messages postés
825
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 mars 2019
60 -
Shape s = Shape.intersect(c,r3); // test de collision entre c et r3 et non r3 avec r
ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Je l'ai déjà mis dans mon code
Commenter la réponse de ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
0
Merci
Pouvez vous m'aider svp, c'est une des dernières étapes de la création de mon jeux 2D, merci.
ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Ah ok je viens de comprendre, je n'avais pas vu, merci je vais essayer
Commenter la réponse de ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
0
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
Jithel
Messages postés
825
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 mars 2019
60 -
Pardon, je me suis trompé, c'est
if(!collision)
ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Bonjour, merci de m'avoir répondu, j'ai compris le principe , c'est très intelligent, merci bcp
Commenter la réponse de ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
0
Merci
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();
});
Jithel
Messages postés
825
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 mars 2019
60 -
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;

}
}
ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Il faudrait mettre le code où du coup ?
ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Pouvez vous m'aider svp
Jithel
Messages postés
825
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 mars 2019
60 -
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) {
ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Ok merci c bon j'ai réussi.
Commenter la réponse de ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
0
Merci
Bonjour, comment faire pour quand il y a collision entre le cercle c et la line lr3, cela écrit dans la console "Coucou"???
Commenter la réponse de ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
0
Merci
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");
							  
							}
					
						}
						
						
ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Il n'y a pas de code d'erreur, le programme de lance bien mais les collisions ne marchent pas
Jithel
Messages postés
825
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 mars 2019
60 > ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Je pense que ce code n'est pas bon :

Shape s = Shape.intersect(c,lr3);//Creation collision ligne gauche
    boolean collision = s.getBoundsInLocal().isEmpty();
    
    Shape s1 = Shape.intersect(c,lr6);//Creation collision ligne bas
    boolean collision1 = s.getBoundsInLocal().isEmpty(); // s ou s1 ?
    
    Shape s2 = Shape.intersect(c,lr5);//Creation collision ligne droite
    boolean collision2 = s.getBoundsInLocal().isEmpty(); // s ou s2 ?
    
    Shape s3 = Shape.intersect(c,lr5);//Creation collision ligne haut
    boolean collision3 = s.getBoundsInLocal().isEmpty(); // s ou s3 ?


Vérifie la cohérence de ton code
ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Ok merci je vais essayer de trouver pourquoi, je vais tester les boolean
ikky33
Messages postés
30
Date d'inscription
samedi 21 juillet 2018
Dernière intervention
14 mars 2019
-
Çà ne marche toujours pas
Jithel
Messages postés
825
Date d'inscription
mercredi 20 juin 2018
Dernière intervention
19 mars 2019
60 -
Tu as modifié le code qui était pas bon ?
Commenter la réponse de ikky33