La Place des Développeurs Asmsx par un noob #3: orienter et animer le héros... de la réutilisation du timer de Metalion/Konami
Reprise du message précédent
granced :
Regarde Snake dans Metal Gear, il n'a que 2 positions en plus de la position arrêtée dans chaque direction.
Euh ... Regarde mieux, Granced : il y a 40 macro-sprites (et donc états) différents pour Snake dans MG1
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
Deux mouvements par direction (je ne compte pas les sprites en "double" lorsqu'il est armé, la fois où il est dans l'eau, etc), dans le contexte d'un déplacement "à mains nues" dans une seule direction, dans l'écran de jeu normal (pas sur une échelle par exemple).
Je me suis peut-être mal exprimé
Je me suis peut-être mal exprimé
MSX un jour, MSX toujours !
Pour ma part, ma référence en animation c'est MOG:
Pour la marche on a 2 animations pour 4 directions : droite, gauche, haut et bas, ces deux derniers pour les échelles.(8)
Pour le saut 1 animation pour 2 directions: droite, gauche.(2)
Pour dégainer l'épée on a 1 animation sur 2 situations: posé et saut pour 2 directions: droite, gauche.(4)
Touché on a 2 animations pour 2 directions: droite, gauche.(4)
En pause on a 3 animations pour 2 directions: droite, gauche.(6)
Mort (décomposition) c'est 5 animations par direction: droite, gauche.(10)
soit 34 animations multiplié par 2 sprites 68 animations en tout!
Un vrai tour de force quand on connait la richesse et la qualité d'animation du bestiaire du jeu
Pour la marche on a 2 animations pour 4 directions : droite, gauche, haut et bas, ces deux derniers pour les échelles.(8)
Pour le saut 1 animation pour 2 directions: droite, gauche.(2)
Pour dégainer l'épée on a 1 animation sur 2 situations: posé et saut pour 2 directions: droite, gauche.(4)
Touché on a 2 animations pour 2 directions: droite, gauche.(4)
En pause on a 3 animations pour 2 directions: droite, gauche.(6)
Mort (décomposition) c'est 5 animations par direction: droite, gauche.(10)
soit 34 animations multiplié par 2 sprites 68 animations en tout!
Un vrai tour de force quand on connait la richesse et la qualité d'animation du bestiaire du jeu
Le MSXien le plus à l'ouest ... ou presque
Bon, revenons à notre démo. Petit rappel des améliorations recherchées:
Dans un premier temps j'ai mis 1 point dans le coin d'une pattern et j'ai rempli l'écran avec...
J'ai aussi créer de nouvelles variables que j'ai initialisées notamment a mémorisation de la manette.
Ensuite dans la boucle je lis la manette tous les 4 frames (4x2=8px ) je compare avec l'orientation du héros, si c'est bon déplacement sinon retournement et remise à 0 de la valeur manette.
le GST_DEP_Heros reprend les animations et déplacement du héros...
Voilà c'est tout, ça marche... Même si c'est chaud, pour se retourner il faut être délicat avec la manette
La ch'tite vidéo!
- retournement du Héros sans déplacement
- déplacement du héros avec arrêt sur un caractère (tous les 8px)
Dans un premier temps j'ai mis 1 point dans le coin d'une pattern et j'ai rempli l'écran avec...
J'ai aussi créer de nouvelles variables que j'ai initialisées notamment a mémorisation de la manette.
Code ASM :
;mise en place décor ldb,3;nombre de bank(boucle) ldhl,CHRTBL+32*8 ;redéfinition du caractère 32 (espace)... bank: ld a,1; ...de juste 1 point^^ callWRTVRM; écriture en VRAM ldde,256*8;écart de bank addhl,de;ajouté à l'adresse en VRAM djnzbank; et on boucle ld hl,NAMTBL; début de l'affichage écran ld bc,256*3; nombre de caractères à l'écran lda,32; valeur à afficher call FILVRM; et on remplit! ei ; xor a ld[VAR_ANI_H],a; init variable animation ld[VAR_ORI_H],a;init variable orientation ld[VAR_STICK],a; init de la variable "manette"
Ensuite dans la boucle je lis la manette tous les 4 frames (4x2=8px ) je compare avec l'orientation du héros, si c'est bon déplacement sinon retournement et remise à 0 de la valeur manette.
le GST_DEP_Heros reprend les animations et déplacement du héros...
Code ASM :
LOOP: call WAIT_REFRESH call GST_SPRITES call GST_DEP_Heros ld a,[VAR_TIMER] ; Chargement du timer and 3 callz,GST_STICK jpLOOP ;-----------------------------------------------! ; ; ; ;- - - SOUS PROGRAMME BOUCLE- - - ; ;---------------------------------------------------------- GST_STICK:;---- Gestion mouvement ----- ;---------------------------------------------------------- ; xor a; A=0 (test clavier) call GTSTCK; A= direction flèches clavier cp 0; Si A=0 jr nz,@@GST_ORI; si non (a<>0) saut à la boucle inc a; si oui A=A+1 (A=1) call GTSTCK; A= direction manette 1 cp 0; Si A=0 jr nz,@@GST_ORI; si non (a<>0) saut à la boucle ld[VAR_STICK],a;MAJ de la variable "manette" ret @@GST_ORI: ld[VAR_STICK],a;MAJ de la variable "manette" dec a; on décale de -1 pour partir de 0 ldhl,VAL_ORI_H; HL = adr. orientation heros ldb,0; mise dans BC de a ldc,a; " addhl,bc; HL = On met HL à l'adresse correspondant à adresse d'orientation voulue. lda,[hl]; on met la valeur pointée par hl dans a ldb,a; dans b la nouvelle orientation lda,[VAR_ORI_H]; dans a l'ancienne orientation cpb; comparaison... jpz,@@fin; si égal pas de modif on finit ld a,b ld[VAR_ORI_H],a; si ineégal->MAJ de la variable + ... ld [VAR_SPRITES+(0*4)+2],a ; MAJ N° 1er sprite heros (plan0) add 4 ; +4 pour le second sprite ld [VAR_SPRITES+(1*4)+2],a ; MAJ N° 2nd sprite heros(plan1) xora; et remise à 0... ld[VAR_STICK],a; ...de la variable "manette" pour empecher le mouvement! @@fin: ret
Voilà c'est tout, ça marche... Même si c'est chaud, pour se retourner il faut être délicat avec la manette
La ch'tite vidéo!
Tuto asmsx #3 - MSXosaure 2014(MSX) par MSXosaure
Edit: Zut! J'oubliais les fichiers!
Le MSXien le plus à l'ouest ... ou presque
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie