collision javafx jeux

javafx

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour, j’ai 16 ans et je suis entrant de faire un jeux complet un système de magasin de skins …, il me reste plus que les collisions à mettre et le jeux est fini, dans mon jeux, des Circle ennemies rebondissent sur les murs et le personnage principal est un Circle plus petit, le but étant de rester le plus longtemps en vie sans toucher les ennemies cercles, pourvez vous m’aider svp mr.

+0 -0
Auteur du sujet

Bonjour, merci de m’avoir répondu mais je ne vois pas comment créer la collision, la bool ne marche pas puis, pouvais vous me dire ce qu’il faut faire car je suis encore débutant et je n’ai pas trouver sur internet mr

+0 -0
Auteur du sujet

mon code de mon jeux fait 4000 lignes, mais je peux vous envoyer le déplacement du personnage principal et les ennemies : ` //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 ESCAPE:
                        r.setVisible(true);
                        exit.setVisible(true);
                        re.setVisible(true);
                        
                        
                    
                        
                        
                        
                        break;
                        
                
                    
                        
                      case Z :
                         
                         
                          c.setLayoutY(c.getLayoutY()-7);
                           break;
                             
                        
            
                     
                      
                      
                      case D :
                         
                              c.setLayoutX(c.getLayoutX()+7);
                              break;
                          
                        
                          
                      
                    
                      
                      case Q :
                        
                            c.setLayoutX(c.getLayoutX()-7);
                             
                              break;
                        
                              
                          
                    
                     
                      
                     
                      
                      case S :
                         
                              c.setLayoutY(c.getLayoutY()+7);
                              break;
                          
                          
                    
                                
                    }
                    
                    
        
                    
                     
                    
                    
                    
                    
                    
                
                    //Collision mur de la fenetre :
                           
                    if (c.getLayoutX() > 490){
                          c.setLayoutX(490);
                         
                    }
                    
                    
                    if (c.getLayoutY() > 290){
                          c.setLayoutY(290);
                    }
                    
                    if (c.getLayoutY() < -287){
                          c.setLayoutY(-287);
                    }
                    
                    if (c.getLayoutX() < -488){
                          c.setLayoutX(- 488);
                    }
                    
                    
                
                           
                    
                
            
            };
            
            
            
                   
                   };
                  
        };
        
        
        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();
        });
        
        
         
    

    
        
        
        
                    
                       dx4 = 5;
                     dy4 = 5;
                     
                     
                     
                     //Création déplacement premier cercle ennemie :
                     Timeline loop4 = new Timeline(new KeyFrame(Duration.millis(13), new EventHandler<ActionEvent>(){
                            public void handle(ActionEvent arg) {
                                 balle3.setCenterX(balle3.getCenterX() + dx4);//Déplacement balle
                                 balle3.setCenterY(balle3.getCenterY() + dy4);//CE CODE S'EFFECTUE TOUTE LES 10 MS
                            
                               //rebond Haut:
                                 if(balle3.getCenterY() <=-20){
                                     dy4 = 5;
                                 }
                                 
                                 //rebond Bas:
                                 if(balle3.getCenterY() >= 530){
                                     dy4 = -5;
                                 }
                            
                           
                            //rebond droite :
                                 if(balle3.getCenterX() >= 680){
                                     dx4 = -5;
                                     
                                     
                                 }
                            
                                 
                                 //rebond gauche :
                                 
                                 if(balle3.getCenterX() <= -285){
                                     dx4 = 5;
                                 }
                                     
                            
                            }
                        }));
                        loop4.setCycleCount(Timeline.INDEFINITE);
                        loop4.stop();
                    
                        
                        
                        `

Édité par Nanny33

+0 -0

mon code de mon jeux fait 4000 lignes, mais je peux vous envoyer le déplacement du personnage principal et les ennemies :

Une meilleure idée serait que tu écrives (ailleurs que dans ton jeu) un petit programme qui montre une demi douzaines de balles de vitesse et diamétres variés, qui rebondissent sur les murs et les unes sur les autres.

Comme ça tu étudierais la situation sur un problème plus simple, et tu ne casseras rien dans ton jeu avant d’avoir compris comment faire.

PS: vu ce que tu nous montres, tes 4000 lignes contiennent énormément de lignes vides non formattées, avec des constantes en dur (287 !) et des noms de variables pas du tout parlants (loop4 !). Tu va t’y perdre, forcément, ou du moins y gaspiller trop d’énergie.

C’est normal, ça, un dx quatre pour une balle trois ?

balle3.getCenterX() + dx4

Édité par MichelBillaud

+0 -0
Auteur du sujet

Bonjour, merci de m’avoir répondu, ce que je recherche ce n’est pas que les balles rebondissent entres elles, ce que je recherche c’est que quand le personnage principal qui dirige le cercle c s’arrête quand il touche un cercle ennemie.

+0 -0

Tu as déjà ta réponse : il y a collision quand la distance entre les centres des deux cercles est inférieure ou égale à la somme des rayons.

Pour éviter le calcul de racine carrée

if ( square(x1 - x2) + square(y1 - y2)  <= square(r1 + r2) ) {
    // collision détectée
    ...

avec

static double square(double x) {
   return x * x;
}
+0 -0

Un logiciel ou un jeu n’est pas une seule pièce mais un ensemble de pièces qui faut faire travailler ensemble.

La plupart du temps, il faut y aller étape par étape, et ne pas avoir peur de faire un brouillon ou des essais à plus petites échelles.

+2 -0
Auteur du sujet

Bonjour, merci de m’avoir répondu, j’ai chercher sur un brouillon mais je n’est pas trouvé, MichelBillaud m’avait donné un code permettant de détecter la collision entre cercle, pouvez vous approfondir ce code svp car je n’est pas très bien compris les square ainsi que les x1 …mr

+0 -0
Auteur du sujet

J’ai fais ceci mais dans la console, il y a écrit toujours "collision" même quand il n’y a pas collision :

                                //Collision :
                                
                                
                                //Balle 1 : ennemie
                                double d2 = (c.getLayoutX()-balle1.getLayoutX())*(c.getLayoutX()-balle1.getLayoutX()) + (c.getLayoutY()-balle1.getLayoutY())*(c.getLayoutY()-balle1.getLayoutY());

                                if (d2 > (c.getRadius() + balle1.getRadius())*(c.getRadius() + balle1.getRadius()))

                                  System.out.println("Collision");

                                else

                                     System.out.println("Pas collision");

Édité par Nanny33

+0 -0

J’ai fais ceci mais dans la console, il y a écrit toujours "collision" même quand il n’y a pas collision :

Nanny33

Ce Que Tu Vas Lire Va Te Choquer : c’est parce que tu t’es trompé.

Mais ça arrive à tout le monde. C’est le boulot qui veut ça. On se trompe tout le temps.

Si j’ai défini et utilisé une fonction square() - "carré", en anglais - il y a une raison : ça rend les formules plus simples, donc plus faciles à écrire, à vérifier, et à corriger.

Je trouvais ça déjà assez compliqué avec des x1 - x2, mais bon si tu penses t’en sortir avec des c.getLayoutX() - balle1.getLayoutX(), tant mieux pour toi :-)

Édité par MichelBillaud

+0 -0
Auteur du sujet

Merci, c’est bon j’ai réussi, j’ai juste remplacer .getLayoutX par .getCenterX car c’est des Circle, il me manque la boucle principal du jeux car le code s’effectue que quand la fenêtre s’ouvre et dans mon jeux il faut que le code d’active tout le tmps, pouvez vous me dire comment crée cette boucle et comment utiliser et ou la mettre… çà serait sympathique, et merci encore pour votre aide.

+0 -0
Auteur du sujet

J’ai mis ceci mais dans la console, il y a toujours écrit "collision" quand je bouge et quand il y a collision avec le cercle balle, il n’y a pas écrit "collision" :

                        
                                    
                                    
                                    
                                    //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) {
                    
                    
            //Collision :
                        //Balle : ennemie
                   
         double d2 = (c.getLayoutX()-balle.getLayoutX())*(c.getLayoutX()-balle.getLayoutX()) + (c.getLayoutY()-balle.getLayoutY())*(c.getLayoutY()-balle.getLayoutY());

                    
            if (d2 > (c.getRadius() + balle.getRadius())*(c.getRadius() + balle.getRadius()))

                      System.out.println("Collision");

                    else

                         System.out.println("Pas collision");
                    
                    
            for(KeyCode  t: tab) {
            switch(t)
                      
                       case ESCAPE:
                            r.setVisible(true);
                            exit.setVisible(true);
                            re.setVisible(true);
                            
                            
                        
                            
                            
                            
                            break;
                            
                    
                        
                            
                          case Z :
                             
                             
                                 
                             
                              c.setLayoutY(c.getLayoutY()-7);
                               break;
                             
                            
                
                         
                          
                          
                          case D :
                             
                                  c.setLayoutX(c.getLayoutX()+7);
                                  break;
                              
                            
                              
                          
                        
                          
                          case Q :
                            
                                c.setLayoutX(c.getLayoutX()-7);
                                 
                                  break;
                            
                                  
                              
                        
                         
                          
                         
                          
                          case S :
                             
                                  c.setLayoutY(c.getLayoutY()+7);
                                  break;
                              
                              
                        
                                    
                        }
                        
                        
            
                        
                         
                        
                        
                        
                        
                        
                    
                        //Collision mur de la fenetre :
                               
                        if (c.getLayoutX() > 490){
                              c.setLayoutX(490);
                             
                        }
                        
                        
                        if (c.getLayoutY() > 290){
                              c.setLayoutY(290);
                        }
                        
                        if (c.getLayoutY() < -287){
                              c.setLayoutY(-287);
                        }
                        
                        if (c.getLayoutX() < -488){
                              c.setLayoutX(- 488);
                        }
                        
                        
                    
                               
                        
                    
                
                };
                
                
                
                       
                       };
                      
            };
            
            
            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();
            });
            
            
             
        

        
            
            

Édité par Nanny33

+0 -0
Auteur du sujet

Comment régler alors le problème d’inversement des tests de collisions? J’ai mis < ou > et ca ne change rien, pour les lignes blanches, je regèlerai ceci aux prochaines réponses.

Édité par Nanny33

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte