Je vous laisse une image:

Quand il va plus rapide c'est que le mapper saute 2 pixels (en appuyant sur [ALPHA]). Maintenant je suis en traîn d'écrire la routine de texte, qui est un peu compliquée avec des charactères de tailles variables...
map: .db 1,1,1,1,1,1,1 .db 1,0,0,0,0,0,1 .db 1,0,0,0,2,0,1 .db 1,0,3,0,0,0,1 .db 1,0,0,0,0,0,1 .db 1,1,1,1,1,1,1 brush: .dw brush0 .dw brush1 .dw brush2 .dw brush3 brush0: .db %00000000 ;des renseignements sur la tile, si on peut la traverser, si elle est animée, si on peut interagir avec elle, etc. .db 0 ;nombre de tile brush1: .db %00000001 .db 1 brush2: .db %00000101 .db 2 .dw texte ;des renseignements additionels (pour exemple, si c'est un panneau ou quelque chose de pareil, le label du texte à afficher) brush3: .db %00000011 .db 3Merci à vous tous pour les remarques !
Comment fais tu pour gérer le scrolling?Je le fait pendant l'affichage de l'écran. J'ai un buffer où je dessine un morceau de la carte que je veut afficher qui est une colonne et un rang plus grand que l'écran, c'est-à-dire 7 sprites de large et 5 d'haut. Ici c'est un mapper (plus ou moins) normale, aligné. Où je fais le scrolling c'est en affichant le buffer à l'écran. Je décale chaque octet (avec un peu de SMC) avant de l'afficher:
drawGbuf: ld a,$80 out ($10),a ;establecer row ($80: 0, a $BF:63) ld hl,saferam1-14+(14*64) ;al pasar tenemos que restar 14x64 (12 columnas en la pantalla, dos fuera/parcialmente fuera) xOff = $+1 ld a,0 cp 8 jr c,noSkip inc hl noSkip: yOff = $+1 ld a,0 or a jr z,noSkip2 ld b,a ld de,14 add hl,de djnz $-4 noSkip2: ld a,$20 ;$20: col 0, $2E: col 14 ld c,a fastCopyAgain: ld b,64 ;64 filas inc c ;avanzar a proxima fila ld de,-(14*64) out ($10),a ;actualizar columna add hl,de ld de,13 inc hl fastCopyLoop: add hl,de ld a,(hl) ;cargar valor en gbuf a a rotLeft: .db 0,0,0,0 ;rotar valores que necesitamos maskLeft = $+1 and $FF ;necesitamos los valores a la izquierda ld (byteUno),a inc hl ld a,(hl) ;el proximo byte que llena el resto del primero rotRight: .db 0,0,0,0 maskRight = $+1 and 0 byteUno = $+1 or 0 out ($11),a djnz fastCopyLoop ld a,c cp $2B+1 jr nz,fastCopyAgain ret
Comment gères tu techniquement les hauteurs variables?Ça c'est un peu plus compliqué. Chaque tile que tu vois a son propre groupe de données qui disent au mapper ce qu'il faut faire avec lui. Par exemple, ici la partie gauche du toit de la maison:
brush026: ;bit 0: si la tile est animée ou non ;bit 1: si on peut marcher sur la tile ;bit 2: si la tile a une hauteur différente .db %00000110 ;elle n'est pas animée, on peut pas y passer, et elle a une hauteur variable .db 26 ;l'offset du sprite (26ème sprite) .db 0 ;masque #0 .db 12 ;on peut marcher 12 bits derrière le sprite
exx ld a,e ;e = jouer_y+15+combien à avancer exx and $0f ;l'offset: si on a passé de 16 (à une nouvelle tile) jr nz,$+3 ;si a = 0, il faut changer à $FF (ou n'importe quel grand nombre) dec a ld e,a ld a,(hl) ;hl = nombre de bits/hauteur cp e ;si joueur_y > hauteur, on ne peut pas y passer ld a,0 rla ;alors, a va être 1 si j_Y > hauteur, 0 si j_Y <= hauteur ret
Que veux-tu ajouter?
Concernant le mapper, comment geres-tu les sprites coupés sur les bords??
updateRotation: ld a,(xOff) ;a = 15 and 7 ;a = $7, nous voulons savoir combien il faut décaler les octets ld hl,gbufMask ;une table (voir plus bas) ld e,a ld d,0 add hl,de ;hl = gbufMask+7 ex af,af' ld a,(hl) ;a = %10000000 ld hl,maskLeft ;dans ma routine pour afficher le buffer à l'écran: masque à gauche ld (hl),a ld hl,maskRight cpl ;xor $FF ld (hl),a ;masque à droite (%01111111) ex af,af' ld hl,rotateRight ;si l'offset X est 4 ou plus (nc), il est plus vite de décaler vers la droite cp 4 ;(a=7) jr nc,rotarDer ld hl,rotateLeft ;sinon, vers la gauche rotarDer: and %00000011 ;effacer bit 2 (c'est comme faire: a - 4) a = 3 ld e,a ;de = 3 ld d,0 add hl,de ;hl = rotateRight +3 push hl ld de,rotLeft ;je fais le décalage dans ma routine "fastcopy" ldi ;rrca ldi ;nop ldi ;nop ldi ;nop pop hl ;hl = rotateRight+3 ld de,rotRight ldi ;la même chose ldi ldi ldi ret rotateRight: ;si l'offset et plus de ou égal à 4, décaler gbuf à droite d'1 à 4 fois rrca rrca rrca rrca rotateLeft: ;les nops aide à qu'il n'y aie pas de délai (rrca/rlca utilisent 4 cycles, nop aussi) nop nop nop nop rlca rlca rlca rlca gbufMask: .db %11111111 ;0 .db %11111110 ;1 .db %11111100 ;2 .db %11111000 ;3 .db %11110000 ;4 .db %11100000 ;5 .db %11000000 ;6 .db %10000000 ;7
Comment fais-tu pour l'animation du personnage? Un timer ou tu copies une sprite dans une sprite de base?
ld hl,playerAnimation ;counter de l'animation ld bc,64 ;chaque sprite = 64 octets, 32 pour le sprite et 32 pour son masque ld a,(flechaPulsada) ;si une touche flèche est enfoncée or a ld a,(pulsado) ;combien à avancer (pulsado = 1 normalement, 2 si [ALPHA] est enfoncé) jr nz,$+5 xor a ;remettre counter à zéro (bon, à 2) ld (hl),2 add a,(hl) ld (hl),a ld hl,playerSprite ;l'addresse des sprites du personnage bit 2,a jr z,normalStance add hl,bc ;1ª animacion bit 3,a jr z,$+3 add hl,bc ;2ª normalStance: ;hl = l'address du sprite
Comment est faites la map? Une suite de valeurs pointant l'offset des sprites?
ev: .db 1,2,0 ;X,Y,Type,Adresse .dw obj1 .db 4,4,1 .dw conv1 ev_end:
Je ne sais pas si je te suivre... Je crois que si je fais cela il faudra encore les tester tous à chaque boucle, n'est-ce pas ? pour savoir s'ils sont près du joueur/de la joueuse ou non ?
Sinon pour les objets, plutôt que de tester à chaque tour de boucle il vaudrait peut-être mieux indiquer dans la map s'il y a un objet ou npc. Et du coup faire bouger les npc ou gerer les objets seulement lorsqu'ils sont à proximité du joueur...