Replacement après collision
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.
Code:
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);
}
}
} |
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:
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);
} |
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:
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);
}
} |
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.
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 :
http://sdz-upload.s3.amazonaws.com/prod/upload/0113.png
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 :
http://sdz-upload.s3.amazonaws.com/prod/upload/028.png
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 ?