Voilà ca fait quelque temps que je bosse sur un jeu de plateau (une adaptation du jeu Sonic, en fait
), et je cherche a optimiser certains aspects du prog, notamment la gestion des collisions entre le perso et le decor et/ou les objets presents à l'écran. Gerer des sols planes et des murs tout droits ca pose généralement peu de problèmes, par contre dès qu'on s'amuse avec des sols en pente, des courbes ou même des loopings, ca devient un peu plus casse-tête
Ma map est divsisée en tiles, et j'utilise 3 octets par tile: texture, obstacle & objet. En pratique, un obstacle présent sur un tile est un "mur" de 1 ou 2 pixels de large sur le coté ou en travers du tile a travers lequel le perso peut toujours passer dans un sens (et pas dans l'autre). J'ai donc par exemple une valeur (entre 0 et 255) pour signaler que le perso peut traverser le coté haut du tile de bas en haut (et donc qu'il est bloqué s'il veut traverser de haut en bas), une autre pour caractériser le coté gauche, une autre pour les 2 cotés en meme temps etc...
Le perso est alors matérialisé par un rectangle dans la zone de l'écran, et pour chaque déplacement de 1 pixel dans une certaine direction je dois tester si le coté correspondant du rectangle est en contact avec un obstacle dans la map (cad qu'il faut tester chaque tile couvert en partie par le coté du rectangle).
Tout ca represente pas mal d'opérations a effectuer pour chaque déplacement d'un seul pixel dans une direction, mais pour le moment les résultats sont assez bons, surtout avec les sols planes et les murs droits évidemment... le systeme fonctionne aussi avec des sols en pente mais c deja moins pratique :/ Par contre j'aimerais bien pouvoir intégrer des courbes etc, et là je pense que ce systeme ne pourra plus convenir du tout...
D'autant plus qu'ici, je ne teste généralement qu'une seule direction à la fois, donc dans le cas des pentes par exemple c'est plus délicat puisqu'il faut que le perso puisse suivre la pente sans passer à travers ni voler par dessus... Alors pour les courbes c'est déjà une autre histoire :/
J'ai pensé à d'autres solutions que de découper les obstacles en tile (genre faire des "blocs" 'pente', 'sol', 'creux', 'quart de rond'...) mais je vois pas trop ce qui pourrait etre le plus efficace...
Comme je pense que pas mal de programmeurs ici se sont dejà amusés à faire un jeu de plateau dans ce genre-là, ca serait bien d'avoir des idées ou des conseils sur des méthodes envisageables pour ce genre de fantaisies...
Je pensais au problemes des objets aussi: dans sonic, le perso doit pouvoir marcher sur le dessus d'un bonus comme il le ferait sur un sol normal par exemple, il faut donc que les intéractions entre le perso, la map et les objets soient assez souples pour permettre ca aussi...
Voilà si vous avez déjà réfléchi à cette question pour un jeu de plateau ou quoi, ca m'intéresserait d'avoir votre avis sur la façon d'implémenter tout ça
). C'est certainement ce qu'il y a de moins compliqué et ça marchera dans tous les cas 
.
...) et qui est dans la direction (horizontale) donnée par le paddle.
si ce n'est que je n'utilise pas de table de collisions mais plutot un bout de code asm pour determiner ou se trouve le pixel par rapport a la pente sur le tile (facile pour les pentes mais moins flexible evidemment)
) pour pouvoir utiliser facilement n'importe quelle forme de terrain est de représenter chaque tile par une matrice de la taille du sprite et dont chaque élément coïncidant avec la surface contient l'angle de la pente en radians.
et ce n'est pas très beau parce que comme je n'ai qu'un angle associé à chaque tile, on voit chaque "étape" d'un looping. Mais si tu prévois de pré-roter les sprites par étape de 45° comme sur Mega Drive, alors c'est une autre histoire; et je te conseille si ton moteur n'est pas trop avancé d'utiliser le milieu des pieds de Sonic comme point de collision central plutôt que la tête ou le haut-gauche du personnage (comme on le fait normalement). Ainsi, ton moteur peut fonctionner plus ou moins de la même manière mais tu n'auras pas de problème pour la rotation, et pour les autres trucs plus complexes que tu risques de rencontrer plus tard, tout sera plus simple