collision javafx jeux

javafx

a marqué ce sujet comme résolu.

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.

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();
                    
                        
                        
                        `
+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
+0 -0

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.

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;
}

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.

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

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");
+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 :-)

+0 -0

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.

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();
            });
            
            
             
        

        
            
            
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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