IMTLille-Info / fa17-projet2

Groupe 1 du jeudi
2 stars 1 forks source link

Gestion des Collisions #7

Closed florentvitse closed 9 years ago

florentvitse commented 9 years ago

J'ai essayer de gérer les collisions, ça marche dans l'ensemble sauf quand le personnage se situe entre deux carrées qui constituent la map.

Je m'explique : Le déplacement étant un flottant, les cases sont dans un tableau d'entier, si je suis entre deux cases et que je veux aller à gauche par exemple et que la case obstacle est celle du dessous, comme je compare avec la case qui correspond à mon abscisse, je compare avec la casse du haut = OK => Je peux donc marcher sur la case du dessous du moins que j'ai un pixel dans la case du haut.

(Rappel, les coordonnées du personnage sont par rapport au coin supérieur gauche de l'image. collisions

florentvitse commented 9 years ago

Est-ce que quelqu'un voit comment :

1 - Soit animer le mouvement durant x temps pour qu'il arrive à une autre casse avec des coordonnées entières. 2 - Fixer ce bug sans avoir un algorithme phénoménale.

cdlm commented 9 years ago

N'est-il pas possible dans un premier temps de gérer les déplacements au case-par-case, ou est-ce que c'est important pour les règles que le placement du personnage soit géré finement ? Je parle bien du placement vis-à-vis des règles, pas de l'animation du sprite. Dans un cas on considère que le personnage occupe une certaine surface, on a besoin de savoir sa distance à un ennemi ou obstacle. Dans l'autre cas le personnage est simplement présent ou pas dans une case, et le changement de case est instantané, même si visuellement il y a une transition fluide.

Sinon Slick2D fournit le code pour calculer l'intersection de rectangles, cf par exemple cette question http://stackoverflow.com/questions/24755050/slick2d-rectangle-collision-detection

florentvitse commented 9 years ago

C'est la deuxième méthode que je veux faire fonctionner ! Qu'il se déplace case par case enfaite avec l'animation fluide. Pour gérer les collisions, je calcule juste la case d'après et si c'est un obstacle, j'arrête le mouvement.

cdlm commented 9 years ago

Donc en fait, ce qu'il se passe, c'est que l'utilisateur a donné un nouvel ordre de déplacement alors que l'animation d'un déplacement précédent n'est pas finie.

Solution 0 : mettre fin abruptement à l'animation en cours, commencer directement la suivante à partir de la case où le personnage aurait dû arriver (moche mais réactif) Solution 1 : mémoriser les ordres, les exécuter au rythme de l'animation (probablement frustrant à l'utilisation parce que le personnage va enchainer plusieurs déplacement longtemps après que les touches aient été appuyées) Solution 2 : attendre que le personnage soit sur la case d'arrivée pour regarder si un déplacement est demandé — il y a d'autres méthodes que keyReleased(), vous pouvez tester si une touche est appuyée à l'instant donné plutôt qu'intercepter l'événement "appui" ou "relâchement"