[FR][Asm][TUTO] Faire votre propre personnage
Posted: 29 Sep 2014, 20:38
(En travaux, vous pouvez commencer mais rien ne dit que vous n'aurez pas à revenir sur ce que vous avez écrit. Par contre, vous pouvez spriter sans problèmes)
(Si vous êtes vraiment pressé, je vous rappelle que vous pouvez lire les codes sources de Fox et Falco dans le zip, ils devraient être assez lisibles)
Remarques Diverses
Je ne sais pas du tout si Spasm peut compiler directement en appvars au lieu de compiler en programmes. Je compile donc en programme avant de convertir en appvar. C'est pourquoi j'utiliserai les termes "programme" et "appvar" indifféremment dans ce tutoriel.
Les noms des états, des touches, des labels, etc ayant été définis en anglais dans le smashh.inc (mentionné plus bas) ainsi que dans les codes de Fox et Falco (les personnages utilisés comme exemples de code ici), j'utiliserai dans ce tutoriel des noms anglais pour mes états, touches, labels, etc.
Remarques qui vous faciliteront la vie
Vous pouvez inclure smashh.inc dans votre programme. Il ne contient que des définitions, ni code ni data.
Non seulement il rendra votre code plus lisible (vous écrirez AirNull au lieu de %00000011) mais il me permettra aussi de changer quelques spécifications (même si j'espère que ça n'arrivera jamais) sans que vous n'ayez à tout réécrire, il vous suffira de changer le smashh.inc et de recompiler.
Je vous conseille aussi d'utiliser vos propres macros comme "#define Gravity 38" afin de pouvoir facilement changer cette valeur partout où vous l'utilisez.
Comment les personnages fonctionnent, sans détails (les détails viendront...)
En deux mots, ils fonctionnent par états. Quand votre personnage se tient debout sans rien faire, il est dans un état qu'on pourrait appeler "Standing State". Votre personnage quittera cet état lors de l'appui sur Jump par exemple, pour aller dans le "Jumping State". Un autre exemple est le "Dashing State" (lorsque vous courez), qui se répète (pas exactement) jusqu'à ce que vous appuyez sur A ou Jump, etc.
Le Header
Cette étape est nécessaire pour que le jeu reconnaisse votre personnage et le liste dans le menu de sélection.
Le header commence par un octet, pour l'instant égal à 1. Cet octet est en réalité inutilisé mais dans le cas d'un changement de spécification (qui j'espère n'arrivera jamais), il sera incrémenté, afin que le programme sache quelle spécification votre personnage suit.
Vous avez ensuite besoin de la chaine de caractères "SSBOCHAR",0. C'est ce que le programme utilise pour reconnaître votre appvar en tant que personnage SSBO.
Les deux octets suivants représentent la taille du programme.
Vous utiliserez les 28 octets suivants pour décrire une icône 16x24 pour le menu de sélection de personnages.
Et vous terminez le header avec le nom de votre personnage (évidemment suivi d'un zéro).
Voici ce que cela peut donner par exemple si vous faites Falco :
Informations Générales
Après le header, votre personnage devra comporter quelques informations auxquelles le jeu aura besoin d'accéder vite et/ou souvent. Dans cet ordre :
1 octet: gravité (inutilisé finalement, peut être recyclé)
1 octet: vitesse aérienne
1 octet: traction
1 octet: nombre maximal de sauts (2 en général, 5 pour Rondoudou)
2 octets: vitesse horizontale maximale (pas encore utilisée)
Vous devrez ensuite donner au programme les adresses des états auxquels il devra accéder rapidement. Un contre-exemple de ce type d'états est la deuxième frame du Down Aerial. Vous n'y accéderez qu'après la première frame. Cette première frame en revanche a besoin d'être vite trouvée lorsque le joueur demande un Down Aerial.
Toutes ces adresses prennent deux octets.
Puisque pour l'instant vous n'avez écrit aucun état et n'avez l'adresse d'aucun d'eux, mettez simplement l'adresse du Standing State partout et vous modifierez ceci au fur et à mesure que vous avancez.
Dans cet ordre :
Standing, Airing, Dashing, GroundJump, AirJump, Landing
AirNeutralSpecial, AirSideSpecial, AirDownSpecial, AirUpSpecial
GroundNeutralSpecial, GroundSideSpecial, GroundDownSpecial, GroundUpSpecial
DashAttack
SideSmash, DownSmash, UpSmash
NeutralAir, ForwardAir, BackAir, DownAir, UpAir
LedgeGrabbed
Une petite précision s'impose. L'Axe Parser compile les programmes "dans" la zone mémoire où ils seront exécutés. Pour les développeurs assembleur, je suis en train de dire qu'il n'y a aucun moyen de dire .org 0. Pourtant, les adresses dont je parle doivent être des adresses relatives au début de la data, pas des adresses absolues qui supposent de plus que le programme se trouvera dans une certaine place dans la mémoire.
Heureusement pour vous, vous vous trouvez sur le tutoriel Asm, nous allons nous faciliter la vie en utilisant .org 0. Remarquez cependant que bous avons déjà utilisé un .org 0 pour calculer la taille du programme. Si nous en ajoutons un, nous devons aussi ajouter un nouveau label de fin que nous ajouterons au précédent.
Voici donc ce l'on a pour l'instant.
(Si vous êtes vraiment pressé, je vous rappelle que vous pouvez lire les codes sources de Fox et Falco dans le zip, ils devraient être assez lisibles)
Remarques Diverses
Je ne sais pas du tout si Spasm peut compiler directement en appvars au lieu de compiler en programmes. Je compile donc en programme avant de convertir en appvar. C'est pourquoi j'utiliserai les termes "programme" et "appvar" indifféremment dans ce tutoriel.
Les noms des états, des touches, des labels, etc ayant été définis en anglais dans le smashh.inc (mentionné plus bas) ainsi que dans les codes de Fox et Falco (les personnages utilisés comme exemples de code ici), j'utiliserai dans ce tutoriel des noms anglais pour mes états, touches, labels, etc.
Remarques qui vous faciliteront la vie
Vous pouvez inclure smashh.inc dans votre programme. Il ne contient que des définitions, ni code ni data.
Non seulement il rendra votre code plus lisible (vous écrirez AirNull au lieu de %00000011) mais il me permettra aussi de changer quelques spécifications (même si j'espère que ça n'arrivera jamais) sans que vous n'ayez à tout réécrire, il vous suffira de changer le smashh.inc et de recompiler.
Je vous conseille aussi d'utiliser vos propres macros comme "#define Gravity 38" afin de pouvoir facilement changer cette valeur partout où vous l'utilisez.
Comment les personnages fonctionnent, sans détails (les détails viendront...)
En deux mots, ils fonctionnent par états. Quand votre personnage se tient debout sans rien faire, il est dans un état qu'on pourrait appeler "Standing State". Votre personnage quittera cet état lors de l'appui sur Jump par exemple, pour aller dans le "Jumping State". Un autre exemple est le "Dashing State" (lorsque vous courez), qui se répète (pas exactement) jusqu'à ce que vous appuyez sur A ou Jump, etc.
Le Header
Cette étape est nécessaire pour que le jeu reconnaisse votre personnage et le liste dans le menu de sélection.
Le header commence par un octet, pour l'instant égal à 1. Cet octet est en réalité inutilisé mais dans le cas d'un changement de spécification (qui j'espère n'arrivera jamais), il sera incrémenté, afin que le programme sache quelle spécification votre personnage suit.
Vous avez ensuite besoin de la chaine de caractères "SSBOCHAR",0. C'est ce que le programme utilise pour reconnaître votre appvar en tant que personnage SSBO.
Les deux octets suivants représentent la taille du programme.
Vous utiliserez les 28 octets suivants pour décrire une icône 16x24 pour le menu de sélection de personnages.
Et vous terminez le header avec le nom de votre personnage (évidemment suivi d'un zéro).
Voici ce que cela peut donner par exemple si vous faites Falco :
- Code: Select all
.org 0
.db 1
.db "SSBOCHAR",0
.dw HeaderEnd
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db "Falco",0
HeaderEnd:
Informations Générales
Après le header, votre personnage devra comporter quelques informations auxquelles le jeu aura besoin d'accéder vite et/ou souvent. Dans cet ordre :
1 octet: gravité (inutilisé finalement, peut être recyclé)
1 octet: vitesse aérienne
1 octet: traction
1 octet: nombre maximal de sauts (2 en général, 5 pour Rondoudou)
2 octets: vitesse horizontale maximale (pas encore utilisée)
Vous devrez ensuite donner au programme les adresses des états auxquels il devra accéder rapidement. Un contre-exemple de ce type d'états est la deuxième frame du Down Aerial. Vous n'y accéderez qu'après la première frame. Cette première frame en revanche a besoin d'être vite trouvée lorsque le joueur demande un Down Aerial.
Toutes ces adresses prennent deux octets.
Puisque pour l'instant vous n'avez écrit aucun état et n'avez l'adresse d'aucun d'eux, mettez simplement l'adresse du Standing State partout et vous modifierez ceci au fur et à mesure que vous avancez.
Dans cet ordre :
Standing, Airing, Dashing, GroundJump, AirJump, Landing
AirNeutralSpecial, AirSideSpecial, AirDownSpecial, AirUpSpecial
GroundNeutralSpecial, GroundSideSpecial, GroundDownSpecial, GroundUpSpecial
DashAttack
SideSmash, DownSmash, UpSmash
NeutralAir, ForwardAir, BackAir, DownAir, UpAir
LedgeGrabbed
Une petite précision s'impose. L'Axe Parser compile les programmes "dans" la zone mémoire où ils seront exécutés. Pour les développeurs assembleur, je suis en train de dire qu'il n'y a aucun moyen de dire .org 0. Pourtant, les adresses dont je parle doivent être des adresses relatives au début de la data, pas des adresses absolues qui supposent de plus que le programme se trouvera dans une certaine place dans la mémoire.
Heureusement pour vous, vous vous trouvez sur le tutoriel Asm, nous allons nous faciliter la vie en utilisant .org 0. Remarquez cependant que bous avons déjà utilisé un .org 0 pour calculer la taille du programme. Si nous en ajoutons un, nous devons aussi ajouter un nouveau label de fin que nous ajouterons au précédent.
Voici donc ce l'on a pour l'instant.
- Code: Select all
#define FalcoGravity 38
.org 0
.db 1
.db "SSBOCHAR",0
.dw HeaderEnd+DataEnd
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db "Falco",0
HeaderEnd:
.org 0
;INFO ----------------------------
.db FalcoGravity
.db 5
.db 20
.db 2
.dw 255
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
.dw Stand
Stand:
;nothing here for now
DataEnd:
## dont forget that the DataEnd must be the last line of your program, it's not because you wrote it at a previous step that what you add at the next step must be written after it