CODINGLISTINGS ★ LA TECHNIQUE DES MASQUES: RSX DEMOMASK (CPC REVUE N°22) ★

La Technique des Masques: RSX DEMOMASK (CPC Revue n°22)Coding Listings
La technique des masques dont je vous parle n'est pas la meilleure façon de vous faire remarquer au prochain carnaval de votre vifle ; mais un algorithme informatique bien utile. Ceux d'entre vous qui ont tapé le programme CHERRY PAINT paru en plusieurs épisodes dans CPC ont obtenu un utilitaire de dessin travaillant avec des icônes. Ces icônes sont accessibles grâce à un petit crayon que l'on déplace sans effacer le fond du decor; C'est cela la technique des masques : déplacer un sprite sans altérer le décor. Je vois déjà vos yeux qui brillent rien qu'à l'idée de toutes les possibilités qui s'offrent à vous grâce à cet effet. C'est cette technique que nous allons essayer de comprendre maintenant.
Le masque, ou cache, ou encore matrice est le carré ou le rectangle suffisamment grand pour occulter entièrement le sprite. La routine des masques agit en plusieurs temps. Admettons que nous ayons décidé d'afficher un sprite à l'adresse écran &C100. La première chose que va faire notre routine, c'est de sauvegarder les octets contenus dans le masque positionné à l'adresse &C100. Elle va, de ce fait, mémoriser la partie du décor se trouvant derrière le sprite. Ce n'est seulement qu'après cette première opération que notre sprite sera affiché. Maintenant, que se passe-t-il quand le sprite se déplace ? Un test du joystick a décelé un déplacement du sprite vers la droite. L'adresse écran devient &C100 + 1 = &C101. La deuxième partie de notre routine rentre en action. Les octets du masque que nous avions conservés quelque part dans la mémoire sont restitués à l'adresse &C100. Ce qui a pour effet d'effacer le sprite et de restituer le décor.

Il ne reste plus qu'à recommencer les deux premières actions (enlever un masque et afficher le sprite), mais cette fois-ci à l'adresse &C101. La boucle est bouclée et notre routine est positionnée dans l'attente d'un nouveau test du joystick. La vitesse d'exécution du langage machine permettant d'obtenir un mouvement très souple. Il est quand même à noter que plus le masque sera petit et plus la vitesse d'affichage sera grande car le programme aura moins d'octets à traiter. Tout ceci n'est facilement accessible qu'à ceux d'entre vous qui possèdent quelques notions d'assembleur. Que tous les autres se rassurent, j'ai conçu pour eux un programme qu'il suffira de recopier pour obtenir l'effet décrit plus haut. La routine en assembleur que j'ai écrite a deux avantages : elle est à la fois simple et paramétrable. Paramétrable car il est possible de choisir la taille que l'on désire pour son sprite.

J'ai concu ma routine sous forme de RSX (Shift + arrobas). Quatre RSX qui sont :

  • |TAILLE,X,Y.....logé en &A0C0
  • |ENLEVE, Add écran, Add mémoire .... logé en &A040
  • |SPRITE, Add écran, Add mémoire .... logé en &A000
  • |REMET, Add écran, Add mémoire .... logé en &A080

Voici quelques explications sur ces RSX.

|TAILLE,X,Y Cette instruction permet d'initialiser la taille du masque et du sprite. X étant le nombre d'octets de large du sprite. Y, le nombre de lignes de pixels. Si nous travaillons en mode 1 et que notre sprite occupe 2 caractères de large et deux lignes texte de haut, nous aurons l'instruction : ITAILLE,4,16. Cette initialisation ne se fera qu'une fois en début de programme.

|ENLEVE,&C100,&9500 C'est cette instruction qui va sauvegarder en mémoire les octets de la partie du décor sur laquelle nous allons afficher notre sprite. &C100 étant l'adresse d'écran de départ du masque. &9500 étant l'adresse de départ où sera transférée la valeur des octets du masque.

|SPRITE,&C100,&9000 Cette instruction affiche en &C100 le sprite mémorisé en &9000. Je ne vais pas vous faire un cours sur la façon de créer un sprite. Cherchez dans vos anciens CPC. Néanmoins, je vais être bon avec vous et vous donner un truc qui vaut son pesant d'or.

Créez votre sprite avec des caractères redéfinis (SYMBOL). Utilisez le mode transparent si vous désirez un sprite multicolore (CHR$(22) + CHR$(1 )) et localisez-le en 1,1. Il ne vous reste plus qu'à faire |ENLEVE,&C000,&9000. Votre sprite se retrouvera sauvegardé en &9000. Un conseil : il ne faut pas que votre écran scrolle sinon l'adresse &C000 ne sera peut être plus en 1,1. Vous pouvez vérifier que le transfert s'est bien effectué en faisant

FOR H = &9000 TO &9000 + (X * Y):A$ = HEX$(PEEK(H),2): PRINT A$;",";:NEXT

Si vous n'obtenez que des zéros ; vous vous êtes planté...

|REMET,&C100,&9500 Cette instruction a le même effet que |SPRITE à la différence que c'est la partie du décor déjà sauvegardée qui est remise à l'écran. Nous aurions pu nous servir de ISPRITE s'il n'y avait eu le problème du OR (les octets du sprite subissent un OU).

Passons maintenant à l'application pratique. Tapez le programme basic et vous obtiendrez un hélicoptère sur fond de montagne (très stylisée la montagne...). Le déplacement ne se fait pas au pixel près, mais avec un crantage comme nous l'aurions obtenu avec des LOCATE X,Y. Un déplacement au pixel près nécessite une routine beaucoup plus complexe et adaptée à chaque taille de sprite.

Mon propos, ici, est de permettre à tout un chacun d'utiliser ces nouvelles commandes dans un programme de sa conception. J'attire votre attention sur la fonction DEF FN po(x,y). Cette instruction a pour effet de transformer une coordonnée X,Y en adresse écran. Si vous désirez travailler en MODE 0, remplacez en fin de ligne le 2 par un 4.

Accessoirement, ces fonctions RSX écrites pour la technique des masques peuvent être détournées et avoir une autre utilité : le transfert de fenêtres.

Vous venez d'écrire un programme

de jeu avec un tableau de scores en bas d'écran sur les lignes 23, 24, et 25. Pour une raison quelconque, vous désirez transférer ce tableau en haut d'écran sur les lignes 1, 2 et 3. Grâce à mes RSX, cela vous est possible. Procédez comme suit, une fois les instructions en mémoire.

100 WINDOW #1,1,40,23,25
110 |TAILLE,80,24: REM (80 OCTETS PAR LIGNES ET 3*8 = 24 LIGNES DE PIXELS)
120 DEF FN PO(X,Y) = &C000 + (Y-2)*80+ (X-1 )*2
130 A= 1 :B = 23
140 |ENLEVE,FN PO(A,B),&9000
150 CLS # 1
160 |REMET,&C000,&9000
170 END

Utile, non ?

Vous voici en possession d'outils simples et performants. A vous d'en tirer le maximum et de nous en faire profiter par l'intermédiaire de CPC. Bon courage et à vos claviers...

CPC n°22

★ EDITEUR: CPC Revue
★ ANNÉE: 1987
★ CONFIG: 64K + AMSDOS
★ LANGAGE:
★ LiCENCE: LISTING
★ AUTEUR: CLAUDE LE MOULLEC

★ AMSTRAD CPC ★ DOWNLOAD ★

File:
» DEMOMASKDATE: 2012-08-09
DL: 234
TYPE: ZIP
SiZE: 4Ko
NOTE: 40 Cyls
.HFE: Χ

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

Lien(s):
» Coding Src's » Animacja (Bajtek)
» Coding Src's » Graphic - Duo - Mode (CPC Amstrad International)
» Coding Src's » Balls in the Air
» Coding Src's » Stained Glass
» Coding Src's » Disk Monitor (Pixel)
» Coding Src's » Roll-Sin
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» 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 337 millisecondes et consultée 1767 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.