CODING ★ PERFECTIONNEMENT A L'ASSEMBLEUR, Le Flipping ★

Perfectionnement à L'assembleur : Le FlippingCours et initiation du Fanzine Ghouls Fanz

Cette fois-ci, je vais vous initier aux techniques du Flipping.

Cette technique repose sur la permutation d'écrans. Nous allons en avoir besoin tout au long de cet article... (voir article "initiation à l'assembleur").
En fait, pour le moment, on va surtout aborder des effets souvent utilisés dans les démos. Mais sachez que cette technique est obligatoire pour creer un bon jeu d'action...
Je tiens à préciser que nous allons avoir besoin d'utiliser de la rupture, et que je ne vais pas vous apprendre à en creer, parce que c'est très chiant à expliquer, et que d'autres magazines le font très bien (lisez Quasar CPC pour plus d'informations sur les ruptures).

Si vous avez deja lu l'article "design", je parlais à l'interieur de la technique utilisée pour faire bouger un énorme logo en utilisant une simple rupture. Je vais vous apprendre à bouger un gros logo au word près (tous les 2 octets). Vous devez afficher votre logo sur un écran (comme un écran normal). Le principe est de modifier l'offset de votre écran par l'intermédiaire des registres 12 et 13. En effet, si l'on met dans le registre 13 la valeur 1, l'écran se décale entiérement de 2 octets (si l'on considere que le registre 13 contenait la valeur 0 initialement) vers la gauche. Du coup, on en déduit que si l'on s'amuse à faire varier la valeur du registre 13 avec des valeurs regulières, on peut faire bouger notre écran horizontalement... ou plutot notre soi-disant gros logo, si vous voyez ce que je veux dire ! Bon mais comme je le dis dans la rubrique "design", une telle animation est rapide, et ce n'est pas très beau à voir. Alors il existe une technique simple pour avoir un déplacement de notre logo à l'octet près... Vous devez recopier 2 fois votre logo en mémoire avec 1 octet de décalage.Le premier logo représente l'écran A, et le second logo l'écran B. Imaginez une animation du type ECRAN A, ECRAN B, ECRAN A-1,ECRAN B-1, ECRAN B-2, etc... avec comme valeur initiale 20 dans le registre 13 (pour l'écran A), alors notre logo bouge vers la droite. Je sais, c'est assez dur à comprendre au debut, mais en fait c'est vraiment simple. Le seul probleme de cette technique est que le logo prend 2 fois plus de mémoire-video puisque l'on a recopié 2 fois notre logo à l'écran. Mais bon, ne vaut-il pas mieux avoir ce petit gaspillage de mémoire et avoir un beau logo qui bouge horizontalement et fluidement ? A chacun son avis...

On va attaquer un autre effet qui rend pas trop mal etqui a l'avantage de n'utiliser que très peu de temps-machine, tout comme le logo qui bouge de gauche à droite. Cet effet, je l'ai vu dans la Dracula's Night Demo (diffusée dans la PowerSystem Megademo), mais aussi dans l'intro de la Digital Orgasm. Cet effet utilise de la rupture ligne à ligne, en prenant compte que chaques écrans fassent 8 lignes de hauteur (on ne modifie pas le registre 9, on met seulement la valeur 0 dans le registre 4). Le principe repose là-encore sur le basculement de plusieurs écrans: il y en a 8, avec pour chacuns une animation différentede 1 pixel verticalement.

Nous aurons donc besoin de modifier les registres 12 et 13 pour avoir une animation fluide. L'avantage de la rupture ligne à ligne (dans ce cas, on appelle ca plutot "rupture écran par écran) est que notre écran affiché se répete tout seul.Ainsi, on peut faire une animation qui prenne la hauteur quel'on veut... Sans perdre de temps-machine.
En fait, le plus dur à coder pour cet effet n'est pas la routine en elle-meme, mais plutot la routine d'initialisation de nos 8 écrans...

Pour cela, le truc utilisé est d'avoir un sprite qui se répete sur 2 lignes (par exemple, on a un sprite CPC en haut, et exactement le meme en bas de ce sprite). Ainsi, une fois que vous avez votre sprite en mémoire, il vous suffit d'afficher votre sprite à la ligne selectionnée, puis lorsque vous selectionnez la suivante, vous additionnez la largeur de votre sprite d'origine à l'adresse de votre sprite en mémoire,et ainsi de suite... C'est assez dur à expliquer (et chiant coté programmation) alors j'espere que vous avez compris.

Un autre effet sympa qui est la combinaison des 2 techniques vues précedemment: les scrollings différentiels. Regardez juste la première partie de la Dark Age Maxidemo ou la partie de Pict dans The Demo pour savoir ce que c'est... Le principe est simple: on fait un sprite que l'on répete sur 8 lignes et que l'on décale à chaques fois d'un pixel (en mode 1). Pourquoi pas 4 ? Parce que je vous le rappelle on fait varier le registre 12 et 13 qui ne peuvent varier qu'au word près, soit 2 octets, soit 8 pixels en mode 1... On utilise également de la rupture ligne à ligne pour avoir nos écrans toutes les 8 lignes. Aprés tout cela compris, le reste est relativement simple: on fait varier les registres 12 et 13 de cette facon (pour 3scrollings différentiels par exemple):

— scroll 1: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8
— scroll 2: 2 + 4 + 6 + 8
— scroll 3: 4 + 8

Les chiffres donnés reprensentent les écrans (les déplacements de notre sprite que nous avons précalculés au début).
Bah voila, c'est avec cette belle imcompréhension devotre part que je vais arreter cet article. Desolé si vousn'avez pas bien compris tout ce que j'ai écris... De toutes facons, je reste à votre entière disposition si vous avez besoind'aide, alors n'hésitez pas à m'écrire !
La prochaine fois, je ferais carrément tout un article sur les scrollings hardwares à l'octet... et ce n'est pas uneparole en l'air ! Et je vous promets que je serais aussi compréhensible que dans les précédents numéros de Ghoul'sFanz... j'en parle dans Ghoul's Fanz 5...
Normalement cet article devrait se terminer ici mais j'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'œilhumain 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 notrepremier é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 que nous ne sommes pas limités à 1/50 de seconde pour remplir notre écran ! On peut encore avoir une animation fluide à 2/50 deseconde. 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 un inconvé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 vertical coupé 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 permute rentre 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 $ ;
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


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 foisque vous modifiez l'offset de votre écran, c'est là que vousdevrez 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 sontposé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 vous servir le Flipping dans les démos, je vous conseille de faire un petit tour du coté de la rubrique "initiation à l'assembleur".

Ghoul's Fanz

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

Lien(s):
» Coding » Initiation à l'assembleur, Affichage de Sprites
» Coding » Le Design
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 317 millisecondes et consultée 2535 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.