Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1851 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  gestion des collisions dans jeu en 2D java

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

gestion des collisions dans jeu en 2D java

n°2303786
furuyarei
Impossible n\
Posté le 24-07-2017 à 16:55:04  profilanswer
 

Bonjour.  
 
J'ai récemment tenté de reprendre un projet Java que j'avais pas réussit à faire dans ma première année d'école d'ing pour voir si j'avais progressé, mais je bloque la gestion des collisions.
 
Mon niveau de jeu ressemble à échiquier où les cases noires sont des couloirs et les blanches des mures que les personnages ne doivent donc pas traverser.
Il y-a deux personnages sous forme d'une case rouge et une autre bleue.
 
Je pensais être arrivé à comprendre comment fonctionnnent les actionListeners et keyListeners et j'ai pu faire déplacer mes personnages sur la carte, mais mon algorithme censé faire reculter mon personnage quand il rencontre un mur me renvoie sans cesse l'erreur suivante :  
 
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem:  
 The method retreat() is undefined for the type Hacker
 
 at Terrain.actionPerformed(Terrain.java:85)
 at javax.swing.Timer.fireActionPerformed(Timer.java:313)
 at javax.swing.Timer$DoPostEvent.run(Timer.java:245)
 at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
 at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
 at java.awt.EventQueue.access$400(EventQueue.java:97)
 at java.awt.EventQueue$3.run(EventQueue.java:697)
 at java.awt.EventQueue$3.run(EventQueue.java:691)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
 
 
J'ai une classe Hacker (personnage rouge) qui implémente ma KeyListener :  
 
Dans la méthode KeyPressed, je fais ce code :  
 
int key = e.getKeyCode();
   
  if(key == KeyEvent.VK_LEFT) {
   
   dx = -1;
   
  }
   
  if(key == KeyEvent.VK_RIGHT) {
   
   dx = 1;
   
  }
   
  if(key == KeyEvent.VK_UP) {
   
   dy = -1;
   
  }
  if(key == KeyEvent.VK_DOWN) {
   
   dy = 1;
   
  }
 
Dans la méthode KeyReleased, je remets les dx, dy à 0.
 
Je définis en guise de variable en début de class un objet Rectangle hackRect, que j'utilise ensuite depuis ma classe Terrain pour vérifier si il y-a intersection avec les blocs blancs (qui ont chacun aussi un rectangle associé) :  
 
J'utilise dans ma classe terrain un timer et un actionListener pour bouger mon personnage quand une clé est appuyé.
 
Cette ActionListener appelle la méthode move() de ma classe Hacker, ici présente :  
 
public void move() {
   
  xHacker+=dx;
  yHacker+=dy;
  /*hackRect.x = xHacker;
  hackRect.y = yHacker;*/
 
}
 
puis vérifie avec une boucle for, s'il y-a intersection avec un rectangle associé à une classe blanche(ces rectangles étant tous stockés dans une ArrayList<Rectangle> rect) :  
 
----------------------------------------------------------------------------------------------------------------
@Override
 public void actionPerformed(ActionEvent e) {
   
  hacker.move();
   
  for(int i = 0; i < rect.size(); i++) {
   
  if(hacker.hackRect.intersects(rect.get(i))) {
   
   hacker.retreat();
   break;
     
  }
  else {
   
   continue;
   
  }
   
 }
   
  repaint();
 
 }
 
---------------------------------------------------------------------------------------------------------
 
Dans la méthode retreat() de ma classe Hacker, je récupère les dx, dy, à priori pas encore ramenées à 0 tant que je n'ai pas lâché ma clé et je décrémente :  
public void retreat() {
   
  xHacker-=dx;
  yHacker -=dy;
  hackRect.x = xHacker;
  hackRect.y = yHacker;
   
}
 
 
J'ai essayé d'enlever des bouts de code pour voir où l'erreur commençait et il semble que çà vienne en premier lieu des deux dernières lignes de la méthode retreat() où je redéfinis les x et y du rectangle.
 
Ce n'est peut-être pas la seule erreur, mais je ne comprends pourquoi ce changement de coordonnées du rectangle provoque déjà une telle erreur.
 
Si quelqu'un peut m'aider. Merci d'avance.
 
 

mood
Publicité
Posté le 24-07-2017 à 16:55:04  profilanswer
 

n°2303790
bidem
Posté le 24-07-2017 à 18:33:04  profilanswer
 

Code :
  1. The method retreat() is undefined for the type Hacker


 
Donc la méthode retreat() n'est pas visible de là où tu essaye de l'appeler.
 
J'imagine que dans ta classe Hacker tu utilise une classe anonyme et que ta méthode est private.
 
Si c'ets ça, la solution simple est de passer la méthode retreat() en 'protected'.

n°2303859
furuyarei
Impossible n\
Posté le 26-07-2017 à 20:07:27  profilanswer
 

Merci de ta réponse. Je vais essayer tout de suite et former l'autre topic ensuite.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  gestion des collisions dans jeu en 2D java

 

Sujets relatifs
Mon premier dev java sous Androidinterface en java
[Java] Erreur java.net.SocketException : socket closed (EOS)Problème de paramètres Java en SQLJ (JDBC)
JAVA, je bloque totalement...Choix logiciel de gestion de version pour petite équipe
Ouvrir un fichier sur java's Cool 4[Java] Erreur Compilation
next, nextLine en javaExecuter une ligne de commande windows en java
Plus de sujets relatifs à : gestion des collisions dans jeu en 2D java



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR