Fonction d'association des objets

Date 10/12/2010 15:28:27 | Sujet : Space wars

Bonjour à tous ! Ici Eagle4 ! Comment ça va les gens ?
(Petite intro en hommage à Pomf&Thud dont j'apprécie vachement le travail sur leur vidéo de Starcraft 2 ^^)

Aujourd'hui nous allons rentrer (ENFIN me direz vous) dans la partie technique, la plus complexe, celle qui permet de gérer tout nos calculs qui ont besoin de rapidité sur MMF2.

Avant de commencer, et pour comprendre bien ce dont je vais vous parler aujourd'hui, je vous conseil d'aller faire un tour vers ce tutoriel (très bien fait) de zoglu :

http://www.game-corp.net/tutorial-104.html

Nous allons rentrer dans le coeur du moteur de RTS et pour ce faire nous allons utiliser les fastloops afin d'identifier chaque unité dans nos fonctions.

Cela va nous permettre (entre autres) d'associer des objets avec nos unités qui seront intimement liées avec nos actifs d'unité.

Hop une petite image pour illustrer le fait que d'autres objets se "collent" sur nos unités :



Vous remarquerez ici que la minimap ou les barres de vies sont bien liés (au moins en position dans un premier temps) à nos unités.

Pour la partie compliqué et non moins intéressante allez lire la suite
Donc d'abord il faut comprendre pourquoi on utilise une fastloop.

Multimédia Fusion est un logiciel qui permet de "programmer" (j'insiste sur ce terme car même s'il n'y a pas de langage de programmation, on programme via une liste d'évènement, pour ceux qui ne sont pas d'accord, reportez vous à la définition dans un dictionnaire) facilement ou en tout cas, rapidement.

Pour ce faire, certaines fonctions sont réalisées de façon totalement transparente pour l'utilisateur (Ici le codeur, et non pas que le joueur), comme par exemple, la sélection d'une seule instance d'un objet parmi une liste de ce même type d'objet. C'est par exemple facile à montrer, si vous mettez cet évènement :

- L'utilisateur clic sur un objet balle -> balle est détruit

Alors seule la balle sur laquelle on aura cliquer sera détruite car multimédia fusion va tester si cette condition est vrai pour CHAQUE instance de l'objet "balle"

Si on a 30 balles, alors MMF va tester cet évènement 30 fois.

Ici c'est assez facile. Mais par exemple, si on a plusieurs objets bonhomme. Et qu'on a plusieurs objets chapeau, si on veut que chaque chapeau aille bien sur chaque bonhomme en temps réel, on ne peut pas juste écrire :

Toujours -> fixe position chapeau sur position bonhomme

Dans ce cas là, MMF va 20 fois (pour 20 bonhomme et 20 chapeau) fixer les 20 chapeaux sur le bonhomme qu'il aura sélectionné à chaque boucle. Du coup les 20 chapeaux, à la fin de la boucle générale d'évènement se retrouveront sur le dernier bonhomme crée ! C'est normal ! car le fonctionnement d'MMF est logique

Nous allons donc associer et repositionné manuellement chaque chapeau sur chaque bonhomme.

Le principe est le suivant :

- On va créer par exemple en appuyant sur espace un bonhomme ET un chapeau à des positions aléatoire. Dans CE MEME évènement, nous allons attribuer dans la variable A du chapeau, la valeur fixe de notre bonhomme (cette valeur est la seule qui soit forcement différente d'un bonhomme à un autre, malheureusement elle est aléatoire)

-> Ici si on créer un 2ème bonhomme avec son chapeau, l'action mettre la variable A à fixed(bonhomme) ne sera exécuté que pour les objets bonhomme et chapeau créer dans cet évènement car MMF sélectionne automatiquement et UNIQUEMENT les objets qui ont été créer puisque l'action créer objet permet ça. Si on crée 2 chapeau, ils n'auront donc pas tout les deux la valeur fixe du même bonhomme.

- Chaque chapeau contient donc la valeur du bonhomme auquel il est associé. Nous allons donc lancer la fonction spread value 0 dans la variable A du bonhomme, qui aura pour effet de numéroter de 0 à xbonhomme tout nos bonhommes. Nous avons donc une liste de tout nos bonhommes qui se suivent.

- Enfin, dans un always, on va parcourir nos bonhommes avec une fastloop pour qu'à chaque boucle, nous mettions la position du bon chapeau sur le bon bonhomme :

Toujours -> Démarrer la boucle ("boucle") "Nbonhomme" fois

Variable A de bonhomme == index de la loop (ici on sélectionne le bon bonhomme)
+
variable A de chapeau == fixed(bonhomme) (Ici on sélectionne le bon chapeau

Alors

Mettre position chapeau à position bonhomme

Avec cette fonction, c'est imparable, vous avez sélectionné le bon chapeau et le bon bonhomme ! Il ne vous reste plus qu'à tester au moment où vous détruisez le bonhomme, de bien détruire le chapeau qui a la même valeur A que le fixe du bonhomme qui n'a plus de vie

Astuce :

Dans mon jeu Space wars, j'ai parfois besoin de sélectionner mon unité plusieurs fois pour effectuer une action sur CETTE unité. Or, la condition Variable A de unité == index de la loop répétée plusieurs fois demande, je ne sais pas pourquoi, un léger temps d'accès. Si mon jeu teste 20 fois cette condition pour mes 50 unités, alors on se retrouve avec (20*50) 1000 fois où la condition est testé et si c'est dans un always, il faut la tester 60 fois par seconde, soit un total de 60 000 fois ! ! ! !

Donc j'ai opté pour une autre solution, je ne teste ma condition qu'une seule fois pour sélectionner ma bonne unité, et je lui met un flag à ON.

Je n'aurais plus qu'à tester ce flag pour savoir quelle unité est sélectionnée et de mettre après toutes mes conditions un évènement :

- Si boucle + flag à ON alors remettre le flag à OFF

Donc lors de la prochaine boucle, on sélectionnera une autre unité, celle ci n'ayant plus de flag à ON.

Voilà la fin de cet article un peu plus long que les autres et un peu plus difficile à comprendre que les autres (Et on en est qu'au tout début )



Cet article provient de Portfolio professionnel - Willay clement
http://willay.clement.free.fr

L'adresse de cet article est :
http://willay.clement.free.fr/modules/news/article.php?storyid=32