Que veux-tu ajouter?
Je veux d'abord essayer les programmer, car je ne sais pas comment ils vont résulter, quelques trucs utilisant les interruptions pour la routine de texte.
Concernant le mapper, comment geres-tu les sprites coupés sur les bords??
Bon, ce que je fais est assez simple. Premièrement j'affiche le map comme s'il était aligné (comme le map dans oilcap) et le mapper ne fait rien de plus. Ensuite, quand je vais afficher le buffer à l'écran, je décale chaque octet comme il faut. Voyons ton exemple:
Notre sprite a 15 bits (mes sprites sont 16x16) dans un octet, 1 bit dans celui d'à droite.
Pour afficher notre sprite (2):
12222222|22222222|23333333 etc
1 = le sprite à gauche, 3 = le sprite à droite
1. décaler (rrca) sprite 1 un bit à droite, le masquer (%10000000)
2. décaler sprite 2 un bit à droite et le masquer (%01111111)
3. OR sprite 1 avec sprite 2
répéter avec tous les autres octets/sprites
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?
J'ai un variable que j'augmente si on appuie sur une des touches flèche (et que je remets à zéro si on n'appuie sur rien). Chaque 4 pas j'affiche le prochain sprite.
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?
Oui, et chaque map a quelques octets d'informations:
larguer, hauteur, tile par défaut (le "sol"), et pour les coordonnées X/Y ou le personnage doit commencer
J'étais pressé quand j'ai écrit cela, désolé s'il y a quelque chose que je n'ai pas décrit bien. Si tu as des questions, n'hesite pas à demander. J'essayerai à mieux l'expliquer