Tip:
Highlight text to annotate it
X
Bonjour et bienvenue à la partie 7 de mon tuto sur le BGE
Nous allons, dans cette partie, ajouter des animations à notre jeu
Ce tuto comprendra trois parties.
Dans la première nous créerons notre armature
Dans la deuxième nous créerons notre cycle de marche.
À la troisième partie nous allons nous occuper du saut.
Notez que j'utilise Blender 2.60, révision 42137
C'est une version bêta de la 2.60
Nous avons un nouveau dessin pour les détecteurs de collision (Collision Bounds)
que nous réglons dans le contexte 'Physics'
Notez que l'édition de l'Objet en modes Objet et Édition ont des effets différents sur la forme de ces détecteurs.
Difficile à voir avec une boîte, mais si je passe à 'Cylinder'
vous voyez mieux la grande différence qu'il y a.
Bon, commençons ce tutoriel.
D'abord, je veux parenter mon mesh à cette armature que j'ai déjà créée.
Je ne vais pas, dans cette vidéo, vous montrer comment créer une armature
comment la 'rigger', comment la relier au parties du mesh, comment l'animer
mais je le ferai à la partie 6.5
Je passe à une vue orthographique avec la touche '1' du pavé numérique
et passer en fil de fer avec la touche 'z'.
Je place mon armature à l'intérieur de mon perso
Une fois que l'armature est positionnée en sorte que chaque os est à sa place
je sélectionne le perso, Maj-sélectionne l'Armature, appuie sur Ctrl+'p' et choisis "With Automatic Weights"
Vous voyez que maintenant, si je déplace l'Armature le perso suit.
Si j'utilise une animation en créant une 'Dopesheet'
puis un Éditeur de graphique
Je passe la 'Dopesheet' en Éditeur d'Action
Je choisis une Action déjà préparée, 'Walk'
Vous pouvez voir que l'Armature bouge et que le mesh suit.
Au lancement du jeu, assurez-vous que ce 'Modifier' 'Armature' est le premier de la pile.
Vous ne voulez pas appliquer ('Apply') le modificateur car ça le rendrait inutile dans le BGE
Préférablement, ce sera le seul modificateur de la pile. Plus ralentirait trop le jeu et pourrait amener des bugs.
Maintenant je passe à l'Action 'Jump'
Je me place à la frame 0 pour mettre le perso en position de base.
Je remonte l'Armature un peu
Si je lançais le jeu maintenant
en passant en mode 'Textured' et en appuyant sur 'p'
vous remarqueriez que le perso ne bouge pas, que j'appuie sur 'a', 'd' ou la barre d'espacement.
C'est que le perso est devenu l'enfant de l'Armature.
Puisque l'Armature n'obéit pas à ces touches, le perso ne peux plus bouger.
Toutes les briques logiques que nous avons associées à notre perso
et nous allons le renommer 'Player_Mesh'
toutes ces briques, donc, ne servent à rien dans le BGE
Nous devons dons les ré-associer à quelque chose qui contrôlera le perso
Ce pourrait être l'Armature
Cependant, une Armature n'est pas le meilleur Objet sur lequel ajouter des contrôles
ou soumettre à la simulation des lois physiques.
Nous allons donc créer une boîte
avec Maj+a -> Mesh -> Cube
Cette boîte contrôlera la façon dont le perso sera affecté pas la physique du BGE
Elle contrôlera aussi toutes les autres simulations
Le mesh du perso ne sera là que pour l'aspect visuel
l'Armature ne servira que pour certaines animations
et la boîte sera utilisée pour tout le reste.
La boîte, telle quelle, bloque passablement la vue
Alors je la passe en fil de fer, en allant dans le contexte 'Object', panneau 'Display', liste déroulante 'Type'
Ainsi on ne voit que les arêtes de la boîte ce qui ne cache plus le perso
Ce serait aussi bien de voir l'armature alors je sélectionne celle-ci et coche 'Xray' dans le même voisinage de boutons.
Cela permet de voir l'armature de partout.
Cependant, l'Armature elle-même bloque passablement la vue
alors je la passe aussi en fil de fer.
OK, comme je vous le disais, cette boîte contrôlera tout ce qui arrivera au perso.
Je la renomme 'Player_Hitbox'.
Je l'ajuste à la taille du perso.
OK, quelque chose comme ça...
Ensuite je fait de l'Armature l'enfant de la boîte (sél. Armature -> sél. boîte -> Ctrl+p -> Object)
Oh, quelque chose ne va pas...
Gnarf, rrrrrr, %*&)(&*)?&*(?%$% Comment se fait-il qu'il y ait une boucle là ?
Aaaah, OK. Je sélectionnais la boîte du détecteur de collisions, la mauvaise boîte.
Il faut donc que je sélectionne l'Armature ensuite 'Player_Hitbox' puis faire Ctrl+p
Maintenant je peux déplacer seulement la 'Hitbox' qui contrôle le joueur
et mon Armature qui contrôle mon mesh.
Nous allons déplacer toutes les briques associées au perso vers la 'Hitbox'.
Je commence par sélectionner 'Player_Hitbox', Maj-sélectionne 'Player_Mesh'
puis fenêtre 3D > menu Object > Game > Copy Logic Bricks
finalement, Object > Game > Replace Properties.
La 'Hitbox' a maintenant toutes les briques et toutes les propriétés que 'Player_Mesh' a.
J'efface toutes les briques et propriétés de ce dernier pour libérer de l'espace mémoire.
Si je lance le jeu... oups! La boîte nuit toujours...
Correctif à apporter: la passer en 'Invisible' dans le contexte 'Physics'
Pendant que nous sommes là, autant changer le type de la 'Hitbox' à 'Dynamic'
Pour les 'Collision Bounds' on choisit 'Box' et on donne une marge ('Margin') de .5
Si on lance le jeu, le perso se lance vers la droite à une vitesse incroyable.
La raison en est que des objets 'Dynamic' ('Hitbox' et le perso) et un 'Static' (l'Armature) occupent le même endroit.
Ces trois objets entrent en collision l'un avec l'autre ce qui les rend erratiques
Pour pallier à cela je passe 'Player_mesh' et l'Armature en 'No Collision'
Si je lance le jeu, vous voyez que tout fonctionne comme avant.
Passons à la deuxième partie de cette vidéo.
Le cycle de marche.
Celui-ci sera associé à l'Armature et sera commandé par les touches 'a' ou 'd'
Pour cela j'ajoute deux Sensors
Je le ferai cette fois, dans l'éditeur de logique de jeu, avec Maj+a > Sensor > Keyboard
On répète. Le premier se nommera 'A' et le second 'D'. Ils s'activeront avec ces touches.
Ensuite nous ajoutons un Actuator 'Action' qui lancera le cycle de marche.
Les deux Sensors sont reliés au même Controller qui sera de type 'Or'
Car je veux que l'Action se déroule que j'appuie sur 'a' ou 'd'
Dans l'Actuator je choisis l'animation 'Walk'
qui débute à la frame 0 et finit à la frame 29
Je veux la louer en 'Loop Stop'.
Tout semble correct.
Si je lance l'animation on voit que, à tous les changements de direction, l'animation recommence la à frame 0.
La raison en est très étrange
Il semble qu'une valeur de 0 pour 'Priority'
soit la cause du problème
Je ne sais pas pourquoi. Je crois que c'est un bug.
puisque tout est récent dans cet Actuator.
Alors ce peut être un simple bug
Mais, régler la priorité à 1 fait disparaître le problème.
comme vous pouvez le voir
Notre perso est toujours orienté dans la même direction
quelle que soit le sens de son déplacement.
Ce n'est pas ce que nous voulons
Nous voulons que le perso regarde où il va.
Il y a bien de façon d'y arriver
J'ai choisi d'utiliser une propriété.
qui notera le sens du déplacement
et qui lancera une animation
en fait ce sera deux animations
une qui le fera regarder à gauche et l'autre à droite.
selon qu'elle sera 'True' ou 'False'
Tout d'abord il faut créer ces animations.
Pour les armatures, les animations se font en mode 'Pose'
Une armature peut être en mode objet, édition ou de pose.
Le mode objet agit sur toute l'Armature
tout comme n'importe quel autre objet
Le mode édition sert à éditer l'Armature
comme pour n'importe quel objet ici encore
et le mode de pose sert à l'animation des éléments de l'Armature.
Je passe en mode de pose en le choisissant dans cette liste.
ou encore avec Ctrl+TAB
Je détache cette animation et en crée une nouvelle que j'appelle 'Left'
Je coche le bouton au F ('Fake'=simulé) pour que Blender conserve ces données si on le quitte.
Maintenant je vais animer cet os.
Il s'appelle 'Controller' et il contrôle tous les autres os. Si je le déplace tous les autres suivent.
De même pour les rotations.
Il semble que, au moment où j'enregistre cette vidéo
et ça pourrait avoir changé au moment où vous la regardez
il semble qu'on ne peut utiliser deux animations simultanément sur un objet.
Cependant il est possible d'animer deux os en même temps.
Toutes les animations que j'ai déjà crées ('Walk', 'Jump', 'Idle')
s'appliquent aux autres os que 'Controller'
qui, lui, n'est donc pas affecté par ces animations
Ceci signifie que si j'anime Controller
il contrôlera tous les autres os
sans problème car mes animations ne s'appliqueront pas à un même os à la fois.
Ça peut vous sembler un peu confondant pour l'instant
mais souvenez-vous simplement que ce os contrôle tous les autres
et qu'aucune autre animation ne l'affecte
que nous n'utilisons qu'une animation à la fois sur celui-ci.
OK, assez parlé et créons cette animation.
Je veux tourner mon os dans cette direction pour l'animation 'Left'
alors je le fais pivoter de 180 degrés
et je place une clé d'anim de rotation (touche 'i' > Rotation)
Je détache cette animation (bouton au X)
J'en crée une nouvelle, nommée 'Right'
Je coche le bouton au 'F'
Je retourne le perso de 180 degrés dans l'autre direction et j'insère une autre clé
pour placer une clé d'anim 'Rotation'
Maintenant je crée la propriété qui notera la direction vers où le perso regardera.
Je lui donne le doux nom de 'left'
en fait une 'Bolean'
et je lui donne la valeur 'False' par défaut
car, par défaut, le perso regarde vers la droite
Ensuite je veux changer la valeur de la propriété
selon que j'appuie sur 'a' ou 'd'
J'ajoute donc deux Actuators 'Property'
Je renomme le premier 'left = true'
et il affectera ('Assing') à la propriété 'left' la valeur 'True'
Le deuxième Actuator sera 'left = false'
et il affectera à la propriété 'left' la valeur de 'False'.
Je veux activer le premier Actuator quand j'appuie sur 'a'
puis je veux activer le deuxième Actuator quand j'appuie sur 'd'
Si je coche le bouton 'Info' et que je lance le jeu
Vous pouvez voir, en haut et à gauche, que la valeur de 'left' change comme il se doit.
La prochaine étape sera d'utiliser nos animations en accord avec la valeur de 'left'
Pour cela j'ajoute un Sensor 'Property'
et deux Actuators 'Action'
J'appelle le premier 'left'
il utilisera l'animation 'left'
de la frame 0 à la frame 10
Je mets autre chose que 0 pour 'Priority'
et je le relie à mon Sensor 'Property'
Je veux activer cet Actuator quand la propriété est 'True'
alors le type du Sensor sera 'Equal', la propriété sera 'left' et sa valeur devra être 'True'
Lorsque la propriété sera 'False' nous voulons activer le deuxième Actuator
que nous nommerons 'right'
qui utilisera l'animation 'right'
de la frame 0 à la frame 10
et autre chose que 0 pour 'Priority'
Je veux donc lancer cet Actuator lorsque la propriété 'left' est à 'False'
Au lieu de créer un autre Sensor 'Property' pour tester si 'left' est à 'False'
tout ce que je ferai est d'ajouter un 'Controller' de type 'And'
Si vous allez sur la Wikipédia
à l'article sur les 'Logic Gates' (cherchez 'Fonctions Logiques')
on voit que la sortie d'un 'Controller' de type 'Nand' sera positive tant qu'il aura un 'False' en entrée.
Puisque cette entrée sera 'False'
ce Controller deviendra 'True'
ce qui activera l'Actuator 'right'
Pour résumer
La touche 'a' active l'Actuator 'left = true'
et la touche 'd' active l'Actuator 'left = false'
Quand la propriété 'left' est à 'True' le perso pointe vers la gauche.
et si 'left' est à 'False', le perso pointe vers la droite.
Si je lance le jeu
...ça marche un peu mais imparfaitement.
la raison en est que les 'Layer' des Actuators 'Walk', 'left' et 'right' sont toutes sur 0
alors nous essayons de jouer deux animations sur le même calque (Layer) en même temps pour un même objet
et nous ne le pouvons pas: il faut passer les animations sur différents calques
Je passe donc le calque de l'Actuator 'Walk' à 1
et maintenant, si je lance le jeu, vous voyez que tout marche parfaitement.
Le perso tourne encore trop vite, en une seule frame
peut-être pourrait-on adoucir ce mouvent
Pour cela nous réglons 'Blending' à 10
et il faudra maintenant 10 frames pour compléter l'animation
Si je mets 10 aux 'Blending' des Actuators 'left' et 'right'
vous voyez qu'il faut maintenant 10 frames au perso pour se retourner complètement.
Ce qui est beaucoup mieux.
Nous aimerions aussi que le perso ne tourne pas le dos à la caméra
Nous allons retourner à notre Action 'right'
passer en vue de dessus
et nous tournons l'os 'Controller' de 5 degrés vers la camera.
on place une clé d'anim 'Rotation'
On fait de même pour l'Action 'left'
Puisque les Actions commencent avec un petit penchant vers la caméra
l'interpolation d'animation se fera dans ce sens.
Je libère cette Action
je fais Alt+r pour enlever les rotations de l'objet sélectionné
et je quitte le mode de pose avec Ctrl+TAB
Pavé numérique 0 pour une vue de caméra.
Je lance le jeu et vous voyez que le perso tourne en faisant face à la caméra.
et que l'animation de marche... marche correctement
Il reste tout de même un problème caché
c'est que si je vais vers la gauche et appuie sur 'd' brièvement
mon perso se dirigera vers la gauche tout en regardant vers la droite
La raison de cela est que, quand j'appuie sur 'd'
je rends la propriété 'left' fausse.
alors que quand je maintiens 'a' enfoncé
je ne fais pas passer la propriété à 'True' de façon durable
Je ne la fais passer à 'True' seulement au moment où j'appuie sur la touche.
Pour corriger cela je coche le bouton 'True Triggering' pour les Sensor 'A' et 'D'
pour que chacun envoie une impulsion positive à chaque frame où la touche est maintenue enfoncée.
ce qui activera immanquablement leur Actuator respectif.
Ce qui résout le problème.
La dernière partie de ce partie 6 est l'ajout d'un animation 'Idle' (idle = 'au repos')
qui sera utilisée à tous les coups où le perso n'avancera pas.
Pour cela j'ajoute un Actuator 'Action'
que je renomme 'Idle'
elle jouera l'animation 'Idle'
qui s'étend de la frame 0 à la frame 20
Je lui donne un 'Blending' de 10
Je lui donne une autre 'Priority' que 0
et 'Layer' sera 1
puisque nous ne voulons pas que cette action entre en conflit avec les Actuators 'left' et 'right'
Il n'y aura pas de problème avec 'Walk' car il ne sera jamais activé en même temps que 'Idle'
Comme je le disais, je veux que 'Idle' soit activé quand le perso n'avance pas
c.-à-d. à tout moment où ni 'a' ni 'd' ne sont enfoncés.
J'ajoute donc un 'Controller' 'Nor'
et si nous retournons à la Wikipédia
vous verrez que le 'Controller' Nor n'est vrai que si tous les inputs sont faux.
Je relie donc les Sensor 'A' et 'D' à ce 'Contorller' Nor puis ce dernier à l'Actuator 'Idle'
Je le remonte un peu qu'on s'y retrouve.
Remonte cet Actuator
Et maintenant, si nous lançons le jeu encore une fois, vous voyez que... oh, nous avons un problème.
Cela tient au fait que l'anim 'Idle' doit être jouée en 'Loop Stop'
Et maintenant vous pouvez voir que... nous avons un problème vraiment étrange !
Aha! Il faut que les Actuators 'left' et 'right' jouent aussi leurs anims en 'Loop Stop'
Et maintenant tout devrait aller... vous voyez que lorsque je n'appuie sur aucune touche mon perso est animé par 'Idle'
Donc, les déplacements de notre perso sont étalblis
ce qui conclut la deuxième partie de cette partie 6
Passons à la troisième partie, l'animation du saut
Nous allons la placer dans un autre état, comme nous l'avons fait pour notre perso plus tôt
Pour nous amener dans cet autre état nous utiliserons un Sensor 'Keyboard'
qui attend la barre d'espacement ('Space Bar') et qui en portera le nom.
et ce Sensor activera un 'Actuator' 'State'
qui basculera entre nos deux premiers états
Je le renomme 'change 2'
Dans le deuxième état nous ajoutons un Sensor 'Always'
que je renomme 'trigger'
qui activera un Actuator 'Action' que je renomme 'jump'
qui jouera l'anim 'jump' de la frame 0 à la 20
Blending à 3
'Priority' différent de 0
Je relie 'trigger' à 'Jump'
Et vous pouvez voir que mon perso saute quand j'appuie sur la barre d'espacement.
Il nous faut maintenant un moyen de revenir au premier état
et il nous faut aussi trouver le moyen de rejouer cette animation
quand nous faisons notre 'Double Jump' (saut doublé)
Le meilleur moyen que j'ai trouvé est d'utiliser des 'Messages'
La 'Hitbox' enverra un message à l'Armature quand nous sauterons pour une deuxième fois
ou quand elle retouche le sol.
J'ajoute donc deux Actuators 'Message'
Je renomme le premier 'jump'
l'autre 'ground'
Le message du premier sera envoyé à 'Player_Armature'
Idem pour le deuxième Actuator.
et je veux envoyer ce message 'jump'
à toutes les fois que mon perso saute
alors je relie cet Actuator 'Message' to ce 'Controller' 'And'
et je veux envoyer ce 'Message' 'Ground' lorsque nous changeons d'état
alors je relie cet Actuator 'ground' à ce 'Controller' 'And' qui change les états
Pour l'Armature j'ajoute deux Sensors 'Message'
Le premier sera 'jump'
et le deuxième sera 'ground'
Le premier, 'jump' activera cette animation à nouveau...
Cependant...non.
En fait il ne va pas lancer l'animation.
On ne peut re-jouer une animation avant qu'elle ne soit terminée
Nous avons donc besoin d'un autre Actuator 'Action'
qui sera exactement pareil
mais qui sera sur un calque plus élevé pour qu'il puisse prendre le pas sur l'animation en cours.
'Priority' autre que 0
Frame finale 20
'Blending' à 3
Cet Actuator est sur le calque 0
cet autre sur le calque 2
L'Actuator qui est sur un calque plus élevé remplacera l'autre.
Ooookay...
Je crée un Actuator 'State'
Je relie ceux-ci
Ce Sensor 'Ground' activera cet Actuator 'State'
réglé à 'Change'
pour basculer entre les deux premiers états.
Je le nomme 'change 1'
Tout semble bien réglé.
Si on lance le jeu vous pouvez voir que tout marche très bien.
Cependant le perso ne complète pas ses rotations s'il saute au milieu d'une d'elles
Je crois que c'est le seul problème qui reste.
Il faut donc que les anims 'right' et 'left' puissent jouer que nous soyons dans l'un ou l'autre état.
Nous allons les placer dans un nouvel état
qui sera notre état 'Always' (=toujours)
i.e. un état qui sera toujours 'True'
Pour cela je vais déplacer ces deux 'Controllers' vers le 16ième était ainsi
Enfin voilà...
Maintenant, si nous lançons le jeu, cet état n'est pas actif par défaut
Alors il nous faut aller dans le groupe 'Initial' ici et Maj+clic ce bouton
Ce qui dit à Blender que les états 1 et 16 seront actif d'entrée de jeu
Nous allons avoir un autre problème, que les 'Layers' de 'right' et 'left' sont sur 0
et que 'Jump' ici est aussi sur 0
alors je la passe à 1
et maintenant, si je ne me trompe, tout devrait aller.
Oui, tout est parfait.
Alors ceci conclut ce tuto sur l'animation
Nous avons couvert beaucoup de terrain.
Il se peut que vous n'ayez pas tout compris du premier coup
Alors n'hésitez pas à réécouter la vidéo et à expérimenter.
J'espère que vous avez aimé cette vidéo
que vous y avez appris quelque chose
Je vous souhaite une excellente journée et je vous revois à la partie 7.