Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problèmes en Java courant !

Intersections d'objets, Messages, Aléatoires...

Sujet résolu
    16 janvier 2011 à 17:07:26

    Bonjour à tous,

    j'ai parcouru un peu les "topics" / "tutos" / et "recherches" sans succès

    C'est pourtant essentiel en java donc je pense qu'il vous sera très facile de m'aider : J'ai une fenêtre de jeu, un viseur, des cibles, des projectiles
    _Les projectiles sont lancé depuis le viseur et progresse vers le haut de l'écran
    _Les cibles sont pour l'instant fixe

    J'aimerai que lorsque le Projectile rencontre la Cible, la Cible en question disparaisse !

    Les cibles sont rangés dans un tableau de 1 à 17 (ex : LaCible[1])
    Et les classes Projectiles et Cibles ont les mêmes caractéristique :

    // public constructeur du projectile
    public Projectile(int x, int y, int h, int l,  Image img) {
        X=x ;
        Y=y ;
        Hauteur = h ;
        Largeur = l ;
        Projectile = img;</citation>
    }
    

    Comment faire ???

    CORRECTION :

    // inserer le code des intersects
    				
    				if(viseur.intersects(laCible[i])) {
    				System.out.println("TOUCHER");
    
    				laCible[i].x = laCible[i].x+800000;		
    				laCible[i].y = laCible[i].y+800000;
    


    Voila, en réalité ma solution consiste à éloigner la cible
    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2011 à 19:19:06

      Bonjour

      si tu as les coordonné x et y
      ainsi que la largeur et hauteur de l'objet, tu peux créé un objet Rectangle que java gere avec une methode toute faite pour les intersections :
      http://download.oracle.com/javase/6/do [...] .Rectangle%29

      j'imagine le constructeur de Cible et je met la methode "projectileToucheCible" dedans, mais ce n'est qu'un exemple et à toi de remettre en ordre pour ton code.

      aussi, je créé les methode getX getY get....... dans Projectile en "public" pour pouvoir récupérer ces valeurs dans la classe Cible

      public Projectile(int x, int y, int h, int l, Image img) {
      //critique sur ton code :
      //Par convention, en java, seul les objet commence par des majuscule, je te conseil de modifier Hauteur en hauteur et ainsi de suite......(mais ça fonctionnera quand meme)
      X=x ;
      Y=y ;
      Hauteur = h ;
      Largeur = l ;
      Projectile = img;
      }
      public int getX(){
      return X;
      }
      
      public int getY(){
      return Y;
      }
      
      public int getLargeur(){
      return Largeur;
      }
      
      public int getHauteur(){
      return Hauteur;
      }
      



      public Cible(int x, int y, int h, int l, Image img) {
      X=x ;
      Y=y ;
      Hauteur = h ;
      Largeur = l ;
      Cible = img;
      }
      
      public boolean projectileToucheCible(Projectile proj){
      
      // tout d'abord, creer deux objet Rectangle que java connais avec les valeurs de nos objets:
      //Rectangle(int x, int y, int width, int height) 
      
           Rectangle cible = new Rectangle(X, Y, Largeur, Hauteur);
           Rectangle projectile = new Rectangle(proj.getX(), proj.getY(), proj.getLargeur(), proj.getHauteur());
      
         return cible.intersects(projectile); //retourne "true" si ça touche, "false" sinon
      }
      


      Maintenant tu peux l'utiliser de cette facon :

      Projectil p = new Projectile(10,10,10,10);
      Cicle c = new Cible(10,10,10,10);
      
      if (c.projectileToucheCible(p)){
      //code éxecuter la cible a été touché
      }else{
      //code éxécuté si la cible n'a pas été touché
      }
      


      Compris ?
      • Partager sur Facebook
      • Partager sur Twitter
        16 janvier 2011 à 21:36:29

        Merci beaucoup pour le soutien mais j'ai du mal à l'adapter à mon propre code...

        Je pense que tu as du oublié de me dire qu'il fallait pour que ça marche de faire hérité les caractéristiques de la classe Rectangle :

        public class Cible extends Rectangle{
        



        J'ai essayer ça mais je ne suis pas sur de mon coup :colere2:

        Ou alors j'ai mal compris le concept de l'intersection...
        • Partager sur Facebook
        • Partager sur Twitter
          16 janvier 2011 à 21:54:39

          Oups désolé, comme je code avec Eclipse, ça le rajoute automatiquement :

          Non, inutile d'étendre ta classe car la tu ne veux pas "ameliorer" un objet, tu veux juste te servir d'un objet existant de java.
          Donc, au début de ta classe (tout en haut) qui appel "new Rectangle()", tu rajoute :

          import java.awt.Rectangle;

          Comme ça, java connais l'objet !

          Apres, si ça ne marche toujours pas, poste les parties de code intéressante, on verra se qu'on peut faire.
          • Partager sur Facebook
          • Partager sur Twitter
            16 janvier 2011 à 23:09:30

            Je code avec Eclipse aussi mais je n'ai pas encore tous les bon réflexes !

            J'ai compris ton code et j'ai réussi à l'intégré (je suis en train de créé les conditions du code suivant :

            Projectil p = new Projectile(10,10,10,10);
            Cicle c = new Cible(10,10,10,10);
            
            if (c.projectileToucheCible(p)){
            //code éxecuter la cible a été touché
            }else{
            //code éxécuté si la cible n'a pas été touché
            }
            


            Mais je ne comprend pas la syntaxe sur "Projectil p" et aussi "cicle c" ?
            Une erreur de frappe ?

            Je suis perdu vraiment sur ce concept pourtant j'ai instancié dans des tableaux mes cibles, elles ce déplacent en groupe etc...Je peux aussi les arrêter sur une position.

            En revanche l'interaction avec les autres classes restes très obscure. Si tu veux bien m'aider d'avantage je t'en serais vraiment reconnaissant !
            • Partager sur Facebook
            • Partager sur Twitter
              16 janvier 2011 à 23:27:19

              J'ai fait un petit jeu, avec un vaisseau qui tire des missiles et lorsque le missile touche une cible, la cible disparait!

              j'ai d'abord conçu un objet Missile puis un objet PetitRocher (ici c'est ma cible)

              Les codes suivants sont des copier/collé des codes de mes classes et j'ai effacé ce qui était inintéressant pour le sujet, donc il est possible que des erreurs se soit glissé lorsque j'ai effacé le code inintéressant:

              import java.awt.Color;
              import java.awt.Graphics;
              import java.awt.Rectangle;
              
              public class Missile {
              	
                  int x,y;  
              	 
              	public Missile (int i, int j){ 
                             x = i;  
              		y = j;
              	
              	}
                  
              	public void paint(Graphics g) { 
              		g.setColor(Color.orange);
              	    g.fillOval (x, y, 10,10);
              	}
              	
              	
              	
              	public  Rectangle getBoundingBox(){
              		return new Rectangle(x, y , 10, 10);
              	}
              			}
              





              import java.awt.Color;
              import java.awt.Graphics;
              import java.awt.Rectangle;
              
              
              public class PetitRocher {
                         int x,y;  	
              
              
              	public PetitRocher(int i, int j){ 
              		x = i;  
              		y = j;
              	   
              	
              	}
              
              
              	public void paint(Graphics g) { 
              		g.setColor(Color.CYAN);
              		g.fillOval (x, y, 45,40);
              		
              		
              	}
              	
              
              	public  Rectangle getBoundingBox(){
              		return new Rectangle(x, y , 45, 40);
              }
              
              	}
              




              import java.awt.Rectangle;
              import java.awt.event.KeyEvent;
              import java.awt.event.KeyListener;
              import java.awt.event.MouseEvent;
              import java.awt.event.MouseListener;
              
              import javax.swing.JPanel;
              
              
              public class Jeu extends JPanel {
                  
              	private Rectangle collisionpetitrocher, collisionvaisseau, collisionmissile;
              	
              
                  public Jeu {
                  	
              	}
              
                 
                  public void collision () {
                    
              			collisionvaisseau= pan.vaisseau.getBoundingBox(); 
              			collisionmissile= pan.missile.getBoundingBox();
              			collisionpetitrocher= pan.petitrocher[i].getBoundingBox();
              		  
              	            if (collisionpetitrocher.intersects(collisionmissile)){
              	              pan.petitrocher[i].x= -50;//la cible(que j'ai placé dans un tableau) disparait hors du cadre s'il touche le missile
              		
              				}
              		    } 
              		    
              	}
              




              j'ai fait un peu prés ça et ça fonctionne, le code original est plus grand j'ai géré plusieurs intersections missiles vaisseaux, petit rocher, et j'ai placé l'ensemble dans une méthode play()...

              Ben ouais je remarque qu'il y a des erreurs j'ai effacé l'instanciation de la classe Panneau pan; dans ma classe jeu, dans la classe Panneau j'avais instancié mon missile et mon vaisseau!!
              • Partager sur Facebook
              • Partager sur Twitter
                17 janvier 2011 à 0:35:05

                hello

                Merci pour ton coup de main

                je remarque que j'ai écrit les choses de la même manière que toi pour les premières classes

                en revanche je ne sais pas ou placer ton dernier code ? dans la classe mère ? dans le init ? dans le thread ? :D
                • Partager sur Facebook
                • Partager sur Twitter
                  17 janvier 2011 à 1:23:39

                  Le dernier code je le place dans la méthode qui fait fonctionner le jeu en occurrence moi c'était la méthode play():

                  import java.awt.Rectangle;
                  import java.awt.event.KeyEvent;
                  import java.awt.event.KeyListener;
                  import java.awt.event.MouseEvent;
                  import java.awt.event.MouseListener;
                  
                  import javax.swing.JPanel;
                  
                  
                  public class Jeu extends JPanel{
                     
                  	private Rectangle collisionpetitrocher, collisionvaisseau, collisionmissile;
                  	Vaisseau vaisseau ;
                  	Missile missile;
                      PetitRocher[] petitrocher;
                       Boolean animation = true;
                  	
                      public Jeu (){
                      	petitrocher =new PetitRocher [10];// il y a tout 10 cibles
                          for (int i=0;i<10;i++){ 
                      		petitrocher[i] =new PetitRocher(600*i,(int) (480*  Math.random()));
                                   }
                          
                          vaisseau = new Vaisseau(100,100);
                      	missile = new Missile (vaisseau.x, vaisseau.y);//le missile est placé au départ au meme endroit que le vaisseau
                          
                         
                  	}
                  	
                     
                      public void play(){
                      	 // Ma méthode play dans laquelle je place ma méthode collision  
                      	while  (animation==true){
                      	collision();
                      	}         
                  			}
                      //Si ton jeu se lance dés le debut de l'application tu peut lancer la méthode play dans le main()
                      //Quant à moi j'ai conçu un menu, et lorsqu'on appuie sur le bouton nouveau la méthode play() se lance!
                    
                      
                      
                      public void collision () {
                      	       
                  		    for (int i=0;i<10;i++){ 
                  				petitrocher[i].act();// la méthode act que j'ai pas mit dans mes classes précédentes fait avancer mes cibles
                  				collisionvaisseau=vaisseau.getBoundingBox(); 
                  			    collisionmissile= missile.getBoundingBox();
                  			    collisionpetitrocher= petitrocher[i].getBoundingBox();
                  		    if (collisionpetitrocher.intersects(collisionvaisseau)){
                  			       animation=false;// si les cibles touchent le vaisseau le jeu est finit
                  		              }
                  	        if (collisionpetitrocher.intersects(collisionmissile)){
                  			petitrocher[i].x= -50;// Le petit rocher disparait en dehors du cadre
                  				}
                  		    } 
                  		     
                      }
                     
                  	}
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 janvier 2011 à 14:35:31

                    Merci pour vos codes. J'ai utilisé finalement la classe Rectangle
                    Maintenant j'en suis au stade ou je cherche à faire bouger aléatoirement mes cibles

                    Je réécrirais ici si jamais je ne m'en sors pas
                    :colere2::colere2::colere2:
                    Et en effet je m'en sors pas alors j'ai ce code :

                    catch(Exception ex){
                    	system.out.println("Le processus du jeu c'est arrêté innopinement");
                    //ou encore
                    	System.out.println("TOUCHER");
                    //cela s'affiche dans la console lorsque je touche la cible
                    
                    // on encore celui la :
                    
                    	public void Afficher (Graphics g) {
                            g.drawString (" Hello World! ", 0, 100) ;}
                    
                    // on encore celui la qui marche bien mais qui arrête le jeu pour mettre un pop up devant l'écran (relativement chiant)
                    
                    					String info = "Ton message qui peut être sur plusieurs lignes et relativement long\n"
                    						+ "mais surtout s'il à été composé ailleurs dans le programme.";
                    
                    						javax.swing.JOptionPane.showMessageDialog(null,info);
                    


                    Mais question con !! Comment afficher le message contenu dans le "println" ?
                    il apparaît bien dans la console d'erreur mais je n'arrive pas à l'afficher dans une interface du jeu...

                    Autres problèmes :

                    Mes cibles qui bougent aléatoirement ne le font pas assez de manière "bordélique" :

                    Mon code est le suivant :

                    public int nombreAleatoire = (int) (Math.round(Math.random()*100) );
                    


                    Mais ce n'est pas assez aléatoire...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 janvier 2011 à 19:25:51

                      Pour Ecrire sur la Fenetre tu peux le faire avec l'objet Graphics, et plus ^précisement avec la méthode
                      drawString(String str, int x, int y), regarde ici , Tu auras plus d'explication !
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 janvier 2011 à 20:15:53

                        Oui j'ai lu le tuto hein :-°
                        Mais si je post c'est que je n'ai pas réussi ce que je voulais faire

                        if(viseur.intersects(mechanteCible[i])) {
                        					System.out.println("TOUCHER");}
                        


                        J'aimerai que ce que j'entre dans le println apparaissent aussi pour le joueur, en effet je comptais également faire évoluer le score à l'intérieur de cette méthode mais dès que j'entre une méthode qui appel drawString dans le code suivant :

                        j'ai beaucoup d'erreur

                        for(int i=0; i<9; i++)
                        		{ 			
                        					laCible[i].x = laCible[i].x-0;
                        					laCible[i].y = laCible[i].y-0;
                        					
                        					mechanteCible[i].x = mechanteCible[i].x-0 ;
                        					mechanteCible[i].y = mechanteCible[i].y-0 ;
                        											
                        				// inserer le code des intersects
                        				
                        				if(viseur.intersects(laCible[i])) {
                        					System.out.println("TOUCHER");
                        					
                        					laCible[i].x = laCible[i].x;		
                        					laCible[i].y = laCible[i].y;}		
                        				
                        				if(viseur.intersects(mechanteCible[i])) {
                        					System.out.println("TOUCHER");}
                        
                        				 
                        
                        				                
                        		 }
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 janvier 2011 à 22:54:20

                          Bonsoir

                          Est ce que tu peux pas faire le code suivant:

                          import java.awt.Color;
                          import java.awt.Font;
                          import java.awt.GradientPaint;
                          import java.awt.Graphics;
                          import java.awt.Graphics2D;
                          import javax.swing.JPanel;
                          
                          
                          public class Drawing extends JPanel{
                          	
                          	private Graphics2D g2d, g3d, g4d; 
                          	private GradientPaint gp, gp1, gp2;
                          	private Font font; 
                          	
                          
                            public Drawing() {
                            
                              }
                              
                            public void paintComponent(Graphics g){
                                drawString(g);
                            	}
                            
                            
                          public void drawString(Graphics g){
                          if(viseur.intersects(laCible[i])) {
                          	g3d = (Graphics2D)g;         
                              gp1 = new GradientPaint(0, 0, Color.red, 30, 30, Color.RED, true);
                              font = new Font("Arial Black", Font.PLAIN, 35);
                          	 g3d.setFont(font);
                              g3d.setPaint(gp1);
                          	g3d.drawString("TOUCHER ", 225,250 );
                          	
                          	laCible[i].x = laCible[i].x;		
                          	laCible[i].y = laCible[i].y;}		
                          
                          if(viseur.intersects(mechanteCible[i])) {
                          	g3d = (Graphics2D)g;         
                              gp1 = new GradientPaint(0, 0, Color.red, 30, 30, Color.RED, true);
                              font = new Font("Arial Black", Font.PLAIN, 35);
                          	 g3d.setFont(font);
                              g3d.setPaint(gp1);
                          	g3d.drawString("TOUCHER ", 225,250 );
                             }
                          }
                          


                          Si t'arrives bien à l'adapter ça devrait écrire toucher en rouge a l'endroit 225, 250 de ton jeu!
                          Je sais pas trop si c'est ça que tu veux?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 janvier 2011 à 12:47:58

                            Si, tout à fait...

                            Mais je n'arrive pas à l'adapter et à l'inscrire dans ma boucle

                            j'ai créé une nouvelle classe message et je la dessine lorsque le projectile touche la cible mais il me met une erreur d'écriture sur la classe, alors que j'ai tout déclarer en puclic il ne trouve pas "cible projectile et viseur"

                            :colere2:

                            j'ai du faire une connerie quelques parts mais je ne trouve pas :s
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Problèmes en Java courant !

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown