gestion des collisions dans jeu en 2D java

gestion des collisions dans jeu en 2D java - Java - Programmation

Marsh Posté le 24-07-2017 à 16:55:04    

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.
 
 

Reply

Marsh Posté le 24-07-2017 à 16:55:04   

Reply

Marsh Posté le 24-07-2017 à 18:33:04    

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'.

Reply

Marsh Posté le 26-07-2017 à 20:07:27    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed