diff --git a/src/main/JeuPhysique.java b/src/main/JeuPhysique.java index dfc2edbd48f73e5f7975f1b3dbb08023a206f79d..844079d897841b8dd44684e77e40c5f5bd6d02c8 100644 --- a/src/main/JeuPhysique.java +++ b/src/main/JeuPhysique.java @@ -24,6 +24,9 @@ public class JeuPhysique{ //le rendu public Afficheur affiche; + public final static short MONSTRE=1; + public final static short HERO=2; + public final static short DECORS=3; int i=0; diff --git a/src/physique/Collision.java b/src/physique/Collision.java index 55d1f03dc9af3eea14566634b2821373ea93d6aa..6923c43b345b6339dac2f8e53f7f4cde3061b5dc 100644 --- a/src/physique/Collision.java +++ b/src/physique/Collision.java @@ -11,12 +11,17 @@ package physique; +import static main.JeuPhysique.*; + /** * * @author Pierre-Frederic Villard */ public class Collision { + + public static int typeOfCollision = 0; + /** * */ @@ -46,11 +51,25 @@ public class Collision { * @return */ public static boolean collision(Objet o, Objet o2) { - if ((o.px >= o2.px + o2.width) || (o.px + o.width <= o2.px) - || (o.py >= o2.py + o2.height) || (o.py + o.height <= o2.py)) { - return false; - } - return true; + typeOfCollision=0; + if (o2 instanceof ObjetMonstre) + { + typeOfCollision=MONSTRE; + } + if (o2 instanceof ObjetHeros) + { + typeOfCollision=HERO; + } + if (o2 instanceof ObjetMur) + { + typeOfCollision=DECORS; + } + + if ((o.px >= o2.px + o2.width) || (o.px + o.width <= o2.px) + || (o.py >= o2.py + o2.height) || (o.py + o.height <= o2.py)) { + return false; + } + return true; } // permet de retourner la direction de collision diff --git a/src/physique/Monde.java b/src/physique/Monde.java index dfde3412faa0467d5ef8ac5c47bb7c45c02aa142..f20c584c0b809c38e9aab113112990dc207a16c9 100644 --- a/src/physique/Monde.java +++ b/src/physique/Monde.java @@ -43,6 +43,8 @@ public class Monde { */ public ArrayList<Objet> objets=new ArrayList<Objet>(); + + private int nbMurs=0; /** * les monstres @@ -85,6 +87,9 @@ public class Monde { * @param dy */ public void addMur(int x, int y, int dx, int dy){ objets.add(new ObjetMur(x,y,dx,dy)); + objets.get(nbMurs).index=nbMurs; + nbMurs++; + } /** ajouter monstre @@ -102,7 +107,7 @@ public class Monde { monstres.get(nbMonstres).vy=vy; monstres.get(nbMonstres).px=px; monstres.get(nbMonstres).py=py; - + monstres.get(nbMonstres).index=nbMonstres; nbMonstres++; } @@ -124,7 +129,7 @@ public class Monde { heros.get(nbHeros).vy=vy; heros.get(nbHeros).px=px; heros.get(nbHeros).py=py; - + heros.get(nbHeros).index=nbHeros; nbHeros++; } diff --git a/src/physique/MoteurPhysique.java b/src/physique/MoteurPhysique.java index 32bb5ad07cfe1b0f49586cf27ce3692a930997e7..69bdf8b1f6b59d1866d2a2a97058aecacf8d4d62 100644 --- a/src/physique/MoteurPhysique.java +++ b/src/physique/MoteurPhysique.java @@ -13,7 +13,7 @@ package physique; import java.io.IOException; import java.util.ArrayList; - +import static main.JeuPhysique.*; import controle.Controle; //permet de g�rer la physique @@ -35,7 +35,9 @@ public class MoteurPhysique { public boolean gravity=true; public float gravityValue=-0.04f; - + + public int current_monster_index=0; + public int current_wall_index=0; /** * Construit un moteur par defaut * @throws IOException @@ -49,15 +51,22 @@ public class MoteurPhysique { * */ public void update() { + + monde.balle.collision=0; // mise a jour des objets for (Objet o : monde.objets) { o.update(); o.collision=0; - } + } // mise a jour des monstres for (ObjetMonstre monstre : monde.monstres) { monstre.evolue(); + if (Collision.typeOfCollision==MONSTRE) + { + monde.balle.collision=MONSTRE; + current_monster_index=monstre.index; + } } // gestion du controleur @@ -123,7 +132,7 @@ public class MoteurPhysique { monde.balle.vy = -1; } } - monde.balle.collision=0; + // mise a jour de la balle monde.balle.update(); @@ -132,17 +141,6 @@ public class MoteurPhysique { for (Objet obj : monde.objets) { if (Collision.collision(monde.balle, obj)) { - //m.balle.collision = true; - //obj.collision=true; - - //si collision vient de la gauche ou droite - if (Collision.collisionGauche(monde.balle,obj) - || (Collision.collisionDroite(monde.balle,obj))) - { monde.balle.px = monde.balle.px - monde.balle.vx; - monde.balle.vx-=monde.balle.ax; - monde.balle.vx = -monde.balle.vx; - } - //si collision vient du haut if (Collision.collisionHaut(monde.balle,obj)) { @@ -168,8 +166,22 @@ public class MoteurPhysique { monde.balle.py = monde.balle.py - monde.balle.vy; monde.balle.vy=-monde.balle.vy;; } + + //si collision vient de la gauche ou droite + if (Collision.collisionGauche(monde.balle,obj) + || (Collision.collisionDroite(monde.balle,obj))) + { monde.balle.px = monde.balle.px - monde.balle.vx; + monde.balle.vx-=monde.balle.ax; + monde.balle.vx = -monde.balle.vx; + } + current_wall_index=obj.index; } + } + // Assign the last collision type if not a monster + if (monde.balle.collision==0) + monde.balle.collision=Collision.typeOfCollision; + } } diff --git a/src/physique/Objet.java b/src/physique/Objet.java index 36c612f9589cf6af7cf406dbd7efe394a2b01cf9..07e1e4e7ac39875c680fc0d9ec7a994725a00b1e 100644 --- a/src/physique/Objet.java +++ b/src/physique/Objet.java @@ -107,6 +107,9 @@ public class Objet { //permet de sauver les positions anterieur + // Index de l'élément parmis son type (Monstre , Mur, etc...) + public int index; + /** * */ diff --git a/src/physique/ObjetMonstre.java b/src/physique/ObjetMonstre.java index b8c1af4e61d4464b6da086dfe1cfbae78d38ed5e..6ef9ab0161e36e01fbe91e1a8fb09543014f18b3 100644 --- a/src/physique/ObjetMonstre.java +++ b/src/physique/ObjetMonstre.java @@ -40,7 +40,7 @@ public class ObjetMonstre extends Objet { // lien vers le monde Monde m; - + // par defaut /** @@ -94,7 +94,7 @@ public class ObjetMonstre extends Objet { */ public void evolue() { - if (Collision.collision(this, m.balle)) + if (Collision.collision(m.balle,this)) etat=Etat.COLLISION; // en fonction de l'�tat interne diff --git a/test/miscellaneous/BouclePrincipaleCool.java b/test/miscellaneous/BouclePrincipaleCool.java index 5b1c629867916334ad93596bd6f4e6f80ecabdf4..b243d86053895a47cab1c52ee251107b9bd83a8f 100644 --- a/test/miscellaneous/BouclePrincipaleCool.java +++ b/test/miscellaneous/BouclePrincipaleCool.java @@ -12,6 +12,9 @@ package miscellaneous; import main.BouclePrincipale; import controle.ControleurClavier; +import main.JeuPhysique; +import static main.JeuPhysique.*; +import static physique.Collision.typeOfCollision; /** * @@ -20,6 +23,11 @@ import controle.ControleurClavier; */ public class BouclePrincipaleCool extends BouclePrincipale{ + public BouclePrincipaleCool() throws Exception{ + //creation du jeu + jeuPhysique = new JeuPhysique(); + } + @Override public void lanceBouclePrincipale() throws Exception { @@ -56,6 +64,15 @@ public class BouclePrincipaleCool extends BouclePrincipale{ jeuPhysique.update(); jeuPhysique.render(); + switch (jeuPhysique.moteurPhys.monde.balle.collision) + { + case MONSTRE: System.out.println("Aie avec monstre numéro "+jeuPhysique.moteurPhys.current_monster_index);break; + case HERO: System.out.println("Copain !");break; + case DECORS: System.out.println("Pas mal avec mur numéro "+jeuPhysique.moteurPhys.current_wall_index);break; + default: break; + } + + //apres le render en nanos long timafter=System.nanoTime(); diff --git a/test/testMario.java b/test/testMario.java index 005fe4593b1fbc674bfc274783bae2ce2a0979e5..3eda4a23cbbbb0865ee532699ed540a3132c50ec 100644 --- a/test/testMario.java +++ b/test/testMario.java @@ -23,6 +23,7 @@ import physique.Monde; import physique.MoteurPhysique; import physique.ObjetMur; import afficheur.Sprites; +import miscellaneous.BouclePrincipaleCool; public class testMario { @@ -88,7 +89,7 @@ public class testMario { //on creer l'afficheur du monde affiche=new Afficheur(moteurPhys.monde); // Gestion de la boucle principale - BouclePrincipale maBoucle= new BouclePrincipale(); + BouclePrincipaleCool maBoucle= new BouclePrincipaleCool(); // Ajout du controler à le fenêtre maBoucle.cClavier=cClavier; // Ajout de la vue au jeu