CODING ★ PERFECTIONNEMENT A L'ASSEMBLEUR, Le Flipping ★

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'oeilhumain 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 - http://cpcrulez.fr

CPCrulez[Content Management System] v8.75-desktop/c
Page créée en 047 millisecondes et consultée 1018 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.