Déplacements & Directions dans un jeu 2D
 |
1 Définition, Déclaration et Initialisation
1.1 Introduction
Dans notre exemple nous allons créer un mouvement de 40 directions, programmé en C pour des raisons de portabilités. Sachez que nos directions vont dans l'ordre des aiguilles du montre, c'est à dire :
- la position 0 vers le haut
- la 10 vers la droite
- la 20 vers le bas
- la 30 vers la gauche
La position 40 n'existe pas, il s'agit en fait de la position 0, après la 39 nous avons fait un tour complet et nous revenons donc à la position 0.
1.2 Macro
Tout d'abord nous allons définir un macro nommé NBRE_DIRS comme ceci :
 | // Nombres de directions #define NBRE_DIRS 40 |
Lors de la compilation de notre code, le compilateur remplacera la chaine NBRE_DIRS par le nombre 40, de ce fait vous aurez uniquement à éditer une ligne pour changer la valeur partout dans votre code, c'est fabuleux ces macros 
1.3 Le sprite
Le sprite balle est l'objet que nous pourrons déplacer et faire tourner, nous utilisons la structure suivante pour le déclarer :
 | struct SPRITE { float posX; float posY; int dir; } balle; |
Nous déclarons des nombres réels (float en C (nombre à virgule quoi )) pour les variables posX et posY pour des raisons de précisions et de réalismes, vous comprendrez plus tard. Nous allons en profiter pour initialiser notre structure balle :
 | // Initialisation des variables de la balle balle.posX = 200; balle.posY = 200; balle.dir = 0; |
1.4 Les tableaux de directions
Nous allons maintenant déclarer deux tableaux de nombres réels avec une dimension de NBRE_DIRS (ou le nombre de directions définit avec notre macro, plus haut), nous allons les nommer dirX et dirY. Ces deux tableaux seront initialisés au lancement de notre application et contiendront les valeurs à ajouter à notre sprite, ici, notre objet balle. Pour les initialiser il va nous falloir calculer le sinus et le cosinus des directions voulues, ici nous avons choisit d'utiliser 40 directions, voici donc le calcul à effectuer : 360 / 40 ce qui nous donnent 9, notez ce nombre sur une feuille de papier afin de vous en souvenir. Pour le tableau dirX il nous faut maintenant calculer le sinus de tous les degrés en partant de 0 (direction haut) jusqu'à 351 (360-9), nous ne calculons pas 360 sachant qu'il correspond à un tour complet (0). Nous allons sauter à chaque fois de 9 degrés, cela nous donnera quelque chose comme ça (j'ai choisi une précision de 6 chiffres après la virgule (c'est suffisant)) :
sin(0) = 0.000000 sin(9) = 0.156434 sin(18) = 0.309017 ... sin(333) = -0.453990 sin(342) = -0.309017f sin(351) = -0.156434f
Pour le tableau dirY nous commençons à calculer les cosinus à partir de 180 en tournant toujours dans le sens des aiguilles d'une montre, c'est à dire en additionnant à chaque fois 9 degrés pour enfin revenir à 171 (180-9) :
cos(180) = -1.000000 cos(189) = -0.987688 cos(198) = -0.951057 ... cos(153) = -0.891007 cos(162) = -0.951057 cos(171) = -0.987688
En C, l'initialisation de nos tableaux se fera comme ceci (je vous donne toutes les valeurs, histoire de reposer un peu vos claviers ) :
 | float dirX[40] = { 0.000000f, 0.156356f, 0.308866f, 0.453778f, 0.587528f, 0.706825f, 0.808736f, 0.890753f, 0.950859f, 0.987576f, 1.000000f, 0.987825f, 0.951351f, 0.891476f, 0.809672f, 0.707951f, 0.588816f, 0.455196f, 0.310380f, 0.157929f, 0.001593f, -0.154783f, -0.307350f, -0.452358f, -0.586238f, -0.705698f, -0.807798f, -0.890028f, -0.950365f, -0.987324f, -0.999997f, -0.988071f, -0.951841f, -0.892196f, -0.810605f, -0.709075f, -0.590102f, -0.456614f, -0.311893f, -0.159501f, };
float dirY[40] = { -0.999999f, -0.987949f, -0.951596f, -0.891837f, -0.810139f, -0.708513f, -0.589459f, -0.455905f, -0.311137f, -0.158715f, -0.002389f, 0.153996f, 0.306593f, 0.451648f, 0.585593f, 0.705133f, 0.807329f, 0.889665f, 0.950117f, 0.987198f, 1.000000f, 0.987701f, 0.951106f, 0.891115f, 0.809204f, 0.707388f, 0.588172f, 0.454487f, 0.309623f, 0.157142f, 0.000796f, -0.155569f, -0.308108f, -0.453068f, -0.586883f, -0.706262f, -0.808267f, -0.890391f, -0.950613f, -0.987451f, }; |
(ce code a été généré avec GenDirs) Voilà, nous avons déclaré toutes les constantes et variables nécessaire pour notre exemple, passons maintenant à la mise en pratique.
|
|  |
 |