[Tuto][Gba] Animer les sprites des pokémons et des dresseurs

Pages: [1]

Unifag

  • Membre
  • 883 posts
22 juillet 2013, 00:05
Animer les front et back sprites des pokémons et des dresseurs

On sait tous que les sprites des version gba sont inanimé (sauf pour les front de émeraude), je me propose donc de vous apprendre à les animée pour rendre les débuts de combat un peu plus dynamique, suite à ce tuto vous serez en mesure d'animé les front et back sprites des pokémons, les sprites des dressseurs, ou encore modifier l'animation des backsprites des dresseurs (héro, timmy, etc). De plus les sprites ne seront pas seulement animé en combat mais aussi dans le menu pokémon, et lors de l'utilsation de showpokepic dans un script (plutôt intéressent).
Mais avant de commencer il y a quelques restrictions que vous devez connaitre:
- Chaque pokémons (seulement les pokémons, pas les dresseurs) doit avoir le même nombre de sprites, ce qui induit une certaine quantité de travail.
- Si vous animé le front des pokémons et que ceux-ci ont X sprites, alors les back devront avoir le même nombre de sprites. Et posséderont la même animation (ordre et durée d'affichage, pas les même sprites bien entendu).
- Le combat ne peut pas démarrer temps que l'animation du pokémon adverse n'est pas fini, en revanche pas besoin d'attendre que l'animation du backsprite soit fini pour commencer le combat. Mais si elle elle n'est pas trop longue on peut commencer le combat aussi vite que sans animation.
- L'animation est rejouer quand on sort du sac ou du menu de sélection de pokémon.

Remarque: Toutes ces observation ont étaient faite sur rf/vf, il se peut que ce soit un peu différent sur rse.

Comme vous le constatez ce ne sont pas des contraintes gênante en jeu mais je me devais de vous avertir. Ces contraintes ne sont valable que pour les pokémons, pour ce qui est des dresseurs le système est beaucoup plus pérmitif.
Un gros avantage pour les backsprites est qu'il est possible d'avoir deux parties d'animations différentes, une a l'arriver en combat, puis l'autre quand il lance la balle.

Vous l'aurez compris il y a de quoi se faire plaisir avec de belle animations.  ;) Et si vous n'êtes pas convaincu rendez-vous à la fin de ce tuto pour avoir un aperçu de ce qu'il est possible de faire.

Remarque:  Les nombres précédé d'un '#' sont en hexadécimal, sinon il sont en décimal.
Les bases de l'hexadécimal sont requises pour comprendre le tuto, mais rassurez vous, savoir que #A = 10, #B = 11, etc devrait suffire.


            Les outils nécessaire
Votre éditeur Hexadécimal qui sera notre principale outil.
UnLz-gba pour ajouter les sprites. Les logiciels comme NSE ou Advance sprite editor ne sont pas adapté dans la cas présent.

Augmenter le nombre de sprites d'un pokémon

La première étape pour créer/modifié une animation est d'augmenter le nombre de sprites de sorte à avoir au minimum 2 sprites dans des positions différente pour un même pokémon/dresseur/...

Remarque:  Certains seront tenté de parler de frame, mais comme j'utilise le mot frame pour autre chose plus loin dans ce tuto et que je voulais éviter la confusion je me suis rabattu sur le mot sprite.

Quelque sois l’élément que vous voulez animer la méthode pour insérer les sprites est la même.
Pour commencez il vous faut une image avec vos sprites les un sous les autres, vous devriez obtenir quelque-chose comme ça:
Spoiler
On va maintenant l’insérer grâce à UnLz-gba, je ne vais pas donner de détailles la dessus car je considère que c'est quelque-chose d’acquis (et si ce n'est pas le cas vous trouverez tous un tas de tuto la dessus), en prenant bien sur le soin de bien repointé votre image et aussi de modifier la palette.
A ce stade vous pouvez déjà tester le jeu pour vérifier que vous avez correctement inséré le sprite, si tous fonctionne on continue.

Créer l'animation

Maintenant que nos sprites sont insérer on va pouvoir s'attaquer à l'animation. Avant tous il faut trouver un espace libre dans la rom où nous allons crée notre animation, notez l'offset on en aura besoin par la suite.
Comme vous le savez une animation est composé de plusieurs frame, dans notre cas chaque frame est codée sur 4 octets.
Citer
XX 00 YY 00
Les deuxième et quatrième octets doivent toujours être 00, je ne sais pas à quoi il correspondent mais laissais les à 00 sous peine de voir des bugs graphiques apparaître.
Le premier octet (XX) correspond à l'index du sprite à afficher (de #00 à #FF), si je reprend mon exemple précédent voila comment je doit numéroter chaque sprite:
Spoiler
Le troisième octet (YY) correspond à plusieurs paramètre, les deux premier bits correspondent au flips vertical et horizontal, et les 6 dernier bits sont la durée d'affichage. Ça peut paraître compliqué mais finalement ça ne l'est pas temps que ça, si vous n'avez pas besoin de faire de flips il vous suffit de prendre la durée d'affichage.
La durée d'affichage ne s’exprime pas en seconde mais en nombre de rafraîchissement, en sachant que la gba est cadencé à 60 rafraîchissement/seconde il faudra donc une durée de 60 pour que la frame restent afficher 1s. Je vais prendre un autre exemple, supposons que vous vouliez que l'image s'affiche durant 100ms, il vous suffit alors de faire un produit en croix pour savoir quelle valeur prendre:
1s -> 60 rafraîchissement
0.1s -> ?? rafraîchissement
60*0.1/1 = 6 = #6
Vous mettrez donc 06 à la place de YY.
Si jamais vous voulez faire un split vertical il vous suffit de rajouter #80 à votre durée, et pour un split horizontal #40.

Remarque:  L'utilité des flips est très limité, car en combat il ne sont pas pris en compte, leur seul utilité est donc dans les menus, et peut être les scripts mais je n'ai pas essayer.
De plus comme la durée n'est codée seulement sur 6bits on ne peut aller que de #00 à #3F, mais rien ne nous empêche de faire une seconde frame identique à la suite pour prolonger la durée d'affichage.


Et voila, on à notre première frame, on peut maintenant faire les autres à la suite. Une fois que vous avez fait toute vos frame il faut indiquée que l'animation est fini, pour ce faire il suffit de rajouter #FF FF 00 00 à la suite. En reprenant mon exemple voila ce que je peut obtenir comme animation:
Citer
00 00 20 00   01 00 10 00   02 00 10 00   03 00 10 00   04 00 25 00   03 00 10 00   02 00 10 00   01 00 10 00   00 00 00 00   FF FF 00 00

Remarque:  Il ne faut pas oublier que les backsprite des dresseurs sont animée en 2 temps, il faut donc faire deux animation.
Il ne faut pas non plus oublier que l'animation est commune à tous les pokémon, backsprite comme frontsprite, il faut donc crée l'animation en conséquent.


Repointer

Maintenant que nous avons crée notre animation il faut changé le pointeur de l'animation pour indiqué au jeu où se trouve la nouvelle animation. Cette fois je vais différencier chaque cas car ils sont tous différents. Il faut donc changez le pointeur correspondant à l’élément que vous avez modifié.

            Les pokémons

Les pokémons sont le cas le plus simple, en effet l'animation est commune à tous les pokémons, et donc il n'y à qu'un seul pointeur pour l'animation de tous les pokémons. Voila un tableau avec l'offset pour chaque versions:
VersionRouge FeuVert FeuilleRubySaphireEmeraude
Offset#22EDC8#22EDA4#1F006C#1EFFFC#30723C
Il vous suffit donc de modifier se pointeur pour qu'il pointe vers votre nouvelle animation, petit rappelle:
Si vous avez crée votre table à l'offset  #730004 vous devez donc mettre le pointeur suivant #04007308.

            Dresseur: les backs

Pour les backsprite il y à 2 pointeurs pour chaque dresseur, pour savoir à quelle offset commence la liste de pointeur regardez le tableau:
VersionRouge FeuVert FeuilleRubySaphireEmeraude
Offset#234350#23432C#1F4EBC#1F4E4C#30D7FC

Chaque perso prend 8 octets, pour trouver les pointeurs de votre perso il suffit donc de faire: "offset du tableau"+#8*#x
Voila les valeurs de x pour rf/vf: 0 - hero, 1 - heroine, 2 - type de la tv, 3 - vieille homme, 4 - brendan, 5 - may.
Par contre je connais pas l'ordre des perso pour rse donc il faudra tester les différents pointeur par vous même.
Une fois que vous avez trouvez les pointeurs de votre perso il ne reste plus qu'a les modifié, en sachant que le premier pointeur est correspond à l'animation lors de l'arrivée en combat, et le deuxième pointeur correspond au moment où il lance la ball.

Remarque: Si vous utilisez les version ruby/saphir ou alors émeraude et que vous trouvez l'ordre des perso n'hésitait pas à en faire part ici, j'éditerai le premier post en conséquent.

            Dresseur: les fronts

Cette fois il y à 1 pointeur par sprite. Voila l'offset de la table de pointeur pour chaque version:
VersionRouge FeuVert FeuilleRubySaphireEmeraude
Offset#233298#233274#1F4554#1F44E4#30CD28

Pour retrouver le pointeur du sprite que vous voulez animé il faut connaitre le numéro de notre sprite, pour trouver se numéro je vous conseille d'utiliser A-trainer, sur cette image j'ai encadrer en rouge l'endroit où se trouve le numéro en question:
Spoiler
Ensuite il vous suffis de faire "offset du tableau"+#4*"numéro du sprite" pour trouvez l'offset du pointeur de votre sprite, il ne vous reste plus qu'à le modifier.

Exemple
Pour vous convaincre voila une petite vidéo de ce qu'il est possible de faire:

RioluSH

  • Membre
  • 143 posts
22 juillet 2013, 00:25
Génial, merci de ce tuto sûrement long, mais utile ! (Tu as mis du temps à le rédiger ?)

Elyiøs

  • Membre
  • 3107 posts
22 juillet 2013, 00:31
Encore un superbe tuto

GG

Tuturosso

  • Membre
  • 773 posts
22 juillet 2013, 00:54
Bravo Unifag:)

Myst

  • Membre
  • 1870 posts
22 juillet 2013, 08:13
Tellement de talent.
Excellent.

Elyiøs

  • Membre
  • 3107 posts
22 juillet 2013, 08:26
Léger bug sur le Artikodin.

Unifag

  • Membre
  • 883 posts
22 juillet 2013, 12:24
Je l'ai écrit dans la description, ce que tu appelle bug n'en est pas vraiment, c'est normal puisque je n'ai pas augmenter le nombre de sprites d'artikodin, d'où la contrainte de devoir ajouter des sprites pour tous les pokémons, front-sprite comme back-sprite. De toute manière je doute que quelqu'un aille s'amuser à animer les pokémon vus le temps qu'il faudrait, le principale intérêt ici est de pouvoir animer les dresseurs, et le back des dresseurs. Éventuellement animer certain pokémon '???' pour les utiliser dans un script avec showpokepic, mais faudrait que seul c'est "pokémon" soit animer, et pour ça faut l'ASM, donc pas pour la plus part d'entre vous.

Pour ta question Riolu le plus long à était à me motiver à le commencer  ;D Une fois lancé ça à pas était trop long vu que je maitriser la chose. Le plus dur c'était de pas vous embrouillez avec le vocabulaire, surtout entre animation, frame, et sprite.

Regioh

  • Membre
  • 100 posts
22 juillet 2013, 14:04
Bien joué gars !
J'espère qu'il se retrouvera dans la bibliothèque des tutos.

Arnik

  • Membre
  • 1812 posts
22 juillet 2013, 15:26
Joli travail. Le plus dur est de faire les différentes frames en question.

yushi56

  • Membre
  • 298 posts
22 juillet 2013, 21:17
t'es vraiment le meilleur ;)

Pages: [1]    En haut ↑