CODING ★ INITIATION A L'ASSEMBLEUR, affichage de sprites ★

Initiation à l'assembleur, Affichage de SpritesCours et initiation du Fanzine Ghouls Fanz

Aujourd'hui, on va parler sprite. En effet, afficher un sprite est très important car on en a toujours besoin. Pour une démo, un jeu, un fanzine... et meme parfois pour un utilitaire !

Un sprite est une suite d'octets logés en mémoire quireprésente un dessin quand il est correctement affiché. Onutilise un logiciel de dessin pour creer des sprites: OCP Art Studio se revele etre l'utilitaire de reve. Vous faites votre petit dessin, vous cliquez sur Windows, puis sur Define Window,ensuite vous entourez votre sprite en utilisant les lignes quis'affichent à l'écran. Une fois sprite defini, vous recliquez sur Windows, puis sur File, puis enfin sur Save. Faites bien attention à ne pas sauvegarder votre sprite en mode compacté.

Un fichier à été créé sur votre disc. Il faut connaitre le nombre d'octets que prend votre sprite en largeur et en hauteur. Pour cela, utilisez le Super Monitor d'Antoine. Chargez votre sprite grace à la directive L, visualisez votre sprite par l'intermediaire de la directive V (appuyez sur les touches flechées et Shift pour visualiser votre sprite sous sa forme d'origine, puis appuyez alors sur la touche ESC quand votresprite est correctement affiché). 3 informations vous sont alors données: la largeur (X) de votre sprite, sa hauteur (Y) ainsi que la longueur que prend votre sprite en mémoire. Attention cependant, ces 3 nombres sont exprimés en hexadécimal !

Ensuite, prenez votre assembleur favori et chargez votre sprite à l'adresse où vous le voulez (mais pas dans deszones déjà occupées !). Il nous faut créer une routine qui nouspermette d'afficher notre sprite correctement. Pour cela, jetez un coup d'œil sur cette routine:

ORG #9000
ENT $ ;
SPRITE LD HL,#A000 ; Source
LD DE,#C000 ; Destination
LD B,#0A ; Hauteur du sprite (Y)
SPRITE1 PUSH BC
PUSH DE
LD B,#0C ; Largeur du sprite (X)
SPRITE2 PUSH BC
LD A,(HL)
LD (DE),A
INC HL
INC DE
POP BC
DJNZ SPRITE2
POP DE
LD A,D
ADD A,8
LD D,A
JR NC,SPRITE3
LD BC,#C050
EX DE,HL
ADD HL,BC
EX DE,HL
SPRITE3 POP BC
DJNZ SPRITE1
RET


J'explique. Vous mettez dans HL l'adresse de votre sprite logé en mémoire, vous mettez dans DE l'adresse-écran de destination (pour cette routine, n'utilisez que la mémoire de#C000 à #FFFF). Vous mettez aussi dans la routine la hauteur et la largeur du sprite (là où c'est indiqué dans le source).

Coté programmation, rien de très dur à comprendre, sauf peut-etre ces suites d'instructions:

LD A,D
ADD A,8
LD D,A
JR NC,SPRITE3
LD BC,#C050
EX DE,HL
ADD HL,BC
EX DE,HL
SPRITE3


Cette routine assez spéciale permet de donner l'adresse-écran située juste au-dessous de celle donnée dans DE. Notons que si votre sprite fait seulement 1 caractère dehauteur, vous n'aurez besoin que de ces suites d'instructions:

LD A,D
ADD A,8
LD D,A


Ce truc ne peut s'utiliser que lorsque DE pointait au debut de la routine sur une adresse-écran qui commencait sur lapremière ligne d'un caractère. Si tel n'est pas le cas, vous devrez faire un petit calcul du style 8 (=1 caractère) - nbligne de caractère de debut, le nombre obtenu étant la hauteur maximale de votre sprite... De meme, si vous utilisez en meme temps la pile pour afficher votre sprite, vous aurez une routine vraiment rapide. Tout ceci pour gagner quelques micro-secondes lors de l'affichage... Il est évidemment possible d'avoir une routine qui soitbien plus rapide que celle décrite précedemment, mais elle estdéjà un peu plus complexe (et cela depasse le cadre de cetterubrique). Cependant, selon votre courrier, il est possible que j'en parle dans Ghoul's Fanz 5...

Normalement cet article devrait se terminer ici maisj'ai envie de vous parler du Flipping qui servira également à la rubrique "perfectionnement à l'assembleur"...

Le flipping c'est quoi ? Cette technique repose sur la permutation de 2 écrans. En effet, avec la technique décrite plus haut, si vous affichez un sprite qui possede une hauteur de 40 lignes par exemple, et bien vous aurez de fortes chances pourque votre sprite apparaisse de manière saccadée, "coupée". Pourquoi ? Parce que tout simplement le canon à électron "passe" sur votre animation ! Cela provoque un décalage de temps de l'ordre de 1/50eme de seconde, mais cela suffit à ce que l'œil humain puisse voir le bug...

Donc le principe: on s'occupe de remplir un écran à notre volonté tandis que l'on affiche un autre écran. Quand on afait toutes les modifications que l'on voulait faire sur notre premier écran, on l'affiche, et on bosse alors sur le deuxième écran (qui n'est pas affiché), on affiche notre second écran, et ainsi de suite...

L'avantage de cette routine est que l'on peut mettre beaucoup de temps à construire notre écran. Ce qui veut dire quenous ne sommes pas limités à 1/50 de seconde pour remplir notreécran ! On peut encore avoir une animation fluide à 2/50 de seconde. Quand aux jeux, ils tournent à environ 5/50 de seconde(cela dépend tout de meme du type de jeu).

L'inconvénient de cette routine - car il y a uninconvénient - est de devoir utiliser 2 écrans au lieu d'un seul. Cette technique n'est pas utilisable si l'on veut utiliserde l'overscan total (plein écran) (enfin si c'est possible mais il faudrait alors utiliser de la rupture, et la zone de jeu serait assez petite en hauteur (la moitié de l'écran au maximum)). Sur des écrans deformés, la technique peut devenir interessante ! En effet, imaginez un écran en overscan verticalcoupé de moitié en hauteur, on pourrait utiliser un seul écran(par exemple en #C000 pour avoir une routine BC26 qui fonce !). C'est d'ailleurs une des principales raisons du pourquoi du comment que pas mal de jeux possedent des écrans reconfigurés.En attendant, il est tout à fait possible de faire du Flipping sur des écrans normaux (pas d'overscan), il suffit de permuter entre l'écran en #C000 et celui en #4000 (pour simplifier les choses)...

Voici un exemple de ce à quoi la routine pourrait ressembler:

ORG #9000
ENT $
BOUCLE CALL #BD19
TYPE LD A,0 ; Ne pas mettre de XOR A
OR A
JR Z,TYPE1
XOR A
LD (TYPE+1),A
LD BC,#BC00+12
OUT (C),C
LD BC,#BD00+%00110000 ; #C000
OUT (C),C
JR TYPE2
TYPE1 INC A
LD (TYPE+1),A
LD BC,#BC00+12
OUT (C),C
LD BC,#BD00+%00010000 ; #4000
OUT (C),C
TYPE2
CALL #BB09
CP 32
JP NZ,BOUCLE
LD A,2 ; A=2
CALL #BC0E ; MODE A
RET


A la fin du programme, on met le MODE 2 (mode graphique evidemment) pour remettre l'offset à sa valeur initiale.

Voila. Ca a l'air plutot simple, non ? A chaque fois que vous modifiez l'offset de votre écran, c'est là que vous devrez aussi changer les adresse-écrans où afficher vos sprites.

Avec tout ca, vous pouvez déjà vous lancer dans la programmation d'un petit jeu fluide ! (Enfin bon, les bases sont posées, c'est à vous de faire le reste, non mais !).

Bah voila. On en arrive donc à la fin de cet article. J'espère qu'il vous a plu ! Si vous voulez voir à quoi peut vousservir le Flipping dans les démos, je vous conseille de faire un petit tour du coté de la rubrique "perfectionnement à l'assembleur !".

Ghoul's Fanz

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Le Design
» Coding » Perfectionnement à L'assembleur : Le Flipping
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 755 millisecondes et consultée 4145 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.