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.