MSX Village forum

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

Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1482

Le 23/10/2014 à 11h05

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 :s


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)
   
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 23/10/2014 à 11h11
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é :) :oups


MSX un jour, MSX toujours ! :D
Site web    
MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 774

Le 23/10/2014 à 15h46
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 :|


Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 774

Le 13/11/2014 à 22h54
Bon, revenons à notre démo. Petit rappel des améliorations recherchées:
  1. retournement du Héros sans déplacement
  2. 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 :top ) 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 :oups

La ch'tite vidéo!


Tuto asmsx #3 - MSXosaure 2014(MSX) par MSXosaure

Edit: Zut! J'oubliais les fichiers!

ufopt3.zip


Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie