Bonjour,
Dans mes temps libres, j’essaie aussi de concevoir un jeu vidéo. Aujourd’hui j’essaie de faire un jeu de course de voitures, et je bloque dans la conception et l’organisation du circuit.
Pour le moment je fais simple: le jeu est en 2D, et idéalement j’aimerais que le joueur puisse voir l’ensemble du circuit en permanence avec la position de ses concurrents. On verra pour faire de la 3D plus tard; de toute façon je suis intimement persuadé qu’il faut commencer par imaginer le truc en 2D avant de penser à la 3D, et dans la plupart des jeux 3D on peut avoir une miniature qui affiche tout le circuit donc ça ne sera sûrement pas perdu.
La question de base à laquelle j’essaie de répondre est celle-ci: étant donné la position du joueur (x,y), quel est son avancement sur le circuit ? Est-il à 0%, 10%, 50%, 95% de l’arrivée ? J’aimerais aussi pouvoir le faire dans l’autre sens: si le joueur se crash alors qu’il en était à 45% (sort de la piste ou se fait dégommer par l’adversaire), le replacer au centre de la piste pour repartir au dernier checkpoint à 40%.
J’ai plusieurs questions importantes qui dépendent plus ou moins directement de celle-ci :
- Déterminer à l’instant T quel est le classement (qui est premier, qui est second…)
- Savoir si le joueur est ou non toujours sur la piste et où se trouve le centre de la piste
- concevoir l’IA parfaite, c’est-à-dire celle qui avance toujours exactement au centre de la piste (ça sera notamment utile parce que j’aimerais bien ajouter des missiles autoguidés genre carapace bleue)
- … et le missile qui peut rebomdir sur les bords de la piste (carapace verte)
Au début, j’ai pensé décomposer un circuit en sections: chaque section ayant une longueur et une direction. Par exemple pour un circuit qui représente un hexagone régulier (on verra pour arrondir les angles et faire des jolies courbes plus tard) ça donnerait ceci :
- 150m pi/2 (0° plein nord)
- 300m pi/6 (60° nord-est)
- 300m -pi/6 (120° sud-est)
- 300m -pi/2 (180° plein sud)
- 300m -5pi/6 (-120° sud-ouest)
- 300m 5pi/6 (-60° nord-ouest)
- 150m pi/2 (0° plein nord)
Si on fixe le début du circuit à la position (0;0), alors la fin de la première section / début de la deuxième se trouve en (0;150), qu’on obtient en faisant (0;0) + 150 * (cos(pi/2); sin(pi/2))
.
De même la fin de la deuxième section sera en (0;150) + 300 * (cos(pi/6); sin(pi/6)) = (260;300)
.
Ca me paraît drôlement lourd comme calcul; il doit y avoir plus simple…
Le problème c’est surtout dans l’autre sens. Si par exemple je prends le point (138;230), alors je dois voir que je suis au milieu de la deuxième section, latéralement décâlé de 10m à droite par rapport au centre de la piste (on va dire qu’elle est large, la piste). Le centre de la piste à cette position étant (130;225) (obtenu par interpolation linéaire pour l’exemple, pour le moment j’oublie les jolies courbes j’ai dit). JE dois aussi voir que mon avancement global est de 16.67%, car j’ai parcouru 300m utiles sur les 3.6km du circuit.
Pour le moment, la seule façon que je vois de résoudre ça est de calculer des intersections de segment et des normales aux dits segments. Puis ensuite essayer de quantifier entre 0% et 100% où je me trouve par rapport aux extrêmités du segment calculé (0%=première extrêmité, 100%=seconde extrêmité).
Pour mon hexagone bidon, pour chaque objet du jeu (voiture, missile ou autre), j’ai déjà 7 segments à tester. C’est la mort assurée le jour où je construis un vrai circuit qui risque d’avoir 100 sections non ? ET là je n’ai que des sections rectilignes… ça va encore se corser quand j’aurai des arcs de cercle, et encore mieux si on envisage des courbes de Bézier ou autres…
ça m’a l’air bien compliqué tout ça. Je doute que les jeux vidéo procèdent réellement de cette façon. Il doit y avoir beaucoup, beaucoup, beaucoup plus simple. ON se demande bien comment ils faisaient avec la mémoire et le CPU ridicules de la game boy ou des bornes arcade des années 90.
Comment les vrais jeux vidéo procèdent-ils ? Mon idée de découpage du circuit en sections, dans un premier temps rectilignes, est-elle totalement idiote ?
ET la question bonus: et si je décide de faire un circuit en forme de 8 ? JE trouverais marrant qu’il puisse y avoir des carembolages latéraux.
Merci pour vos réponses !