Bonjour,
Je suis sur un problème que je n'arrive pas à résoudre. J'ai essayer toutes les techniques que j'avais trouvé, mais sans avoir le résultat voulu.
Je vous explique.
Dans la boucle principale, j'update mon Player, puis je teste les collisions, et si il y en a, je replace bien le Player pour ne pas qu'il soit dans le mur.
Ma fonction Update déplace le joueur en haut si le boolean up = true, en bas si le boolean down = true, etc. A l'appuis sur la touche Z, le boolean up se met à true, et dès que le joueur relache la touche, le boolean se met à false.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 // J'update mon Player player.Update(container, delta); // Je teste les collisions et je replace mon Player for (int i = 0; i < level.getTiles().size(); i++) { if (level.getTiles().get(i).isBlockable()) { if (player.getBounds().intersects(level.getTiles().get(i).getBounds())) { player.Replace(level.getTiles().get(i).getBounds(), delta); } } }
Maintenant que mon Player à été mis à jour, je teste les collisions (cf. code 1 ligne 5) avec les tiles qui sont "blockable". Si il y à collision, j'appel la fonction Replace qui replace le joueur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 // Ici, la variable v = 0.3f (la vitesse du Player) public void Update(GameContainer container, int delta) { // Déplacement if (up) { y -= v * delta; } else if (down) { y += v * delta; } if (left) { x -= v * delta; } else if (right) { x += v * delta; } // Bounds Box.setLocation(x, y); }
Tout fonctionne très bien. Enfin pas exactement... quand je vais en haut, c'est bon. Quand je vais en bas, à gauche ou à droite c'est bon aussi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 public void Replace(Rectangle Box2, int delta) { Box.setLocation(x, y); Ici, c'est assez simple à comprendre. Tant qu'il y à collision, je regarde dans quelle(s) direction(s) va le joueur. Selon la direction (ou les directions puisque up et left peuvent être à true tout les deux) je déplace le joueur. while (Box.intersects(Box2)) { if (up) { y += v; } else if (down) { y -= v; } if (left) { x += v; } else if (right) { x -= v; } Box.setLocation(x, y); } }
Mais quand je vais à la fois en haut et à droite, mon Player ne monte pas.
J'ai trouvé pourquoi cela fait ça, mais je n'arrive pas à le régler.
Si je me déplace à la fois en haut et à droite, mon perso sera comme ceci :
Du coup, en rentre dans la fonction Replace puisqu'il y à collision. Donc là, on à cette boucle : Tant qu'il y à collision (c'est le cas), et que up = true (c'est le cas) alors on re-déplace le Player vers le bas. Ce qui fait ceci :
A ce stade, il y à toujours collision. Maintenant, on passe à la condition : if (down) {}. Ce n'est pas notre cas, on passe. Idem pour if (left) {}. Par contre, pour if (right) {}, c'est notre cas ! Donc on re-déplace le Player vers la gauche. Donc là, le Player ne se trouve plus dans le mur. Il n'y à plus collision, on sort de la fonction Replace.
Cependant, notre Player n'à pas été en haut ! Hé oui, étant donné que à la condition if (up) {} on à re-déplace le joueur vers le bas car il y avais collision ! Donc notre personnage n'a pas bougé !
Il faudrait donc que les conditions if (left) et if (right) soit avant if (up) et if (down). Cependant, si je fait ça, le problème persiste, mais pour la gauche et la droite...
Comment faire ?
Partager