Tutorial V1.0 - 18/02/2006 - par DEMONIAK
Dernière mise à jour : 03/03/2006
Ce petit tutorial va donc expliquer comment recréer l'animation du zèbre.



Tout d'abord, les outils dont nous avons besoins :
- ConvImgCPC, dernière version, disponible ici
- PC-CPC, dernière version, disponible ici
- Les 10 images bitmaps (ici des .GIF) qui représentent le zèbre sous différentes positions, disponible ici
- DEPKWIN.BIN, fichier binaire de décompactage et d'affichage de fenêtres ici
Je vous conseille de décompacter le tout (ConvImgCPC, les 10 images du Zèbre et PC-CPC) dans le même répertoire, cela simplifiera l'utilisation par la suite.

Première phase : création des images au format .SCR du CPC.

Il va falloir convertir nos fichiers Bitmap dans un format que le CPC peut comprendre. C'est pour cela que nous allons utiliser ConvImgCPC.
Pour l'animation finale, j'ai choisi le Mode 1 (320x200, 4 couleurs), car les images originales ne disposent que de 8 niveaux de gris.
On lance ConvImgCPC, on choisit le Mode 1, on clique sur Lire Image, on choisit la première (Image01.gif).
Le zèbre apparaît bien dans la zone d'affichage de ConvImgCPC, mais paraît légèrement déformé, et un peu grand.
Si l'on regarde dans la petite fenêtre d'affichage des informations de ConvImgCPC (en bas à droite), on remarque les choses suivantes :

Taille image : 368x272, ratio = 1.35
Taille affichée : 640x400, ratio = 1.60, origine : (0,0)

Qu'est ce que cela veut dire ?
Tout simplement que notre image à une taille en x de 368 pixels, en y de 272 pixels, et que le rapport x/y est égal à 1,35 (faites le calcul, 368/272 donne à peu près 1,35), et que l'affichage central de ConvImgCPC affiche l'image en utilisant une taille de 640 pixels en x et de 400 pixels en y, et que le rapport x/y de cet affichage est égal à 1,60. (là aussi, vous pouvez vérifier...)
Pour que notre image ne semble plus déformée, il faut donc qu'elle ait un ration x/y égal à 1,35. Le plus simple : cochons la case choisir la taille d'affichage en haut à droite dans ConvImgCPC, et en suite on entre 368 dans le champ Nouvelle taille en X: et 272 dans Nouvelle taille en Y:.
Et pour que nos changements de taille prennent effet, il faut cliquer sur le bouton Réafficher en bas à gauche.
Ensuite, on appuie sur le bouton calculer, pour convertir l'affichage de l'image dans le format du CPC choisi (ici le mode 1).
Suivant vos goûts et couleurs, vous pouvez ajouter du tramage ou non, ou bien redéfinir votre propre palette.
Pour cela, il suffit de bloquer les couleurs (la petite case à cocher en dessous de chaque couleur). Plutôt que de cliquer en dessous de chaque couleurs, vous avez la dernière case Tout qui permet de bloquer/débloquer toutes les couleurs en même temps.
Une fois que les couleurs sont bloquées, vous pouvez les modifier à souhait, et lorsque vous re-cliquerez sur le bouton calculer, ConvImgCPC gardera vos couleurs et les utilisera pour calculer l'image CPC.
Lorsque les paramètres vous conviennent, je vous conseille de les noter quelque part, ils vont re-servir...
Chose importante également: sauvegardez votre palette (le bouton sauver en bas à droite dans la zone gestion de la palette), car nous en aurons besoin également ! (donnons lui le nom de zebre.pal, par exemple.)



On pourrait dès maintenant convertir toutes les images du zèbre et les sauvegarder au format .SCR (en cliquant sur le bouton Sauvegarder).
Vous pouvez choisir cette méthode, mais j'aimerai vous en présenter une autre, qui ne se justifie peut-être pas sur une animation de quelques images comme ici, mais qui m'a rendu de grands services sur des animations de plusieurs dixaines d'images.
ConvImgCPC possède en effet un mode ligne de commande avec arguments. Cela signifie que vous pouvez exécuter ConvImgCPC depuis une fenêtre DOS de Windows, en lui ajoutant des arguments...
Voici un exemple concret:

- Tout d'abord, il faut quitter ConvImgCPC, car nous allons le relancer en ligne de commande...
- Ouvrer une session DOS de windows (sous Windows 2000/XP, faites démarrer/exécuter puis tapez cmd puis la touche entrée)
- Allez dans le répertoire où se trouve ConvImgCPC (avec la commande DOS CD)
- Tapez ConvImgCPC -Fimage*.gif

Et là, ConvImgCPC s'exécute, mais en affichant une petite fenêtre avec un fond blanc, dans lequel s'affiche le nom de l'image qu'il est en train de traiter.
Lorsqu'il a traité toutes les images que nous lui avons demandé, la fenêtre se referme, le traitement est terminé.
Que s'est il passé ? un DIR va vous le faire comprendre : vous voyez maintenant 10 nouveaux fichiers : Image01.SCR à Image10.scr.
ConvImgCPC a tout simplement converti tous les fichiers ayant un nom compatible avec le masque image*.gif.
Voila, on pourrait presque dire que notre travail avec ConvImgCPC est terminé. Mais nos fichiers .SCR ne sont pas exactement comme nous l'aurions espéré...
Pour s'en convaincre, un tour dans PC-CPC : lancez l'émulateur...
Tapez ensuite sur la touche F12 de votre clavier. Cette touche permet de définir un répertoire de travail, dans lequel PC-CPC "émulera" le contenu d'une disquette.
Choisissez donc le répertoire où se trouvent nos 10 fichiers .SCR fraichement convertis.
un CAT sous PC-CPC, et vous voyez apparaître tous vos fichiers, dont les 10 fichiers .SCR.



Le catalogue du contenu du disque dur du PC, avec les images .GIF et les images .SCR
Ensuite, tapez, en une seule ligne : MODE 1:LOAD"Image01.SCR":CALL&C7D0 (pour ceux qui veulent un peu réviser le basic, vous pouvez aussi faire tout ça avec un petit programme...)
En exécutant ces commandes basic, la première image du zèbre s'affiche donc à l'écran. Mais, elle n'a pas exactement la même représentation que lorsque l'on avait utilisé ConvImgCPC dans son utilisation "normale"...



L'image telle qu'elle apparaît à l'écran du CPC émulé. Pas vraiment ce que l'on avait voulu, en plus, ici, on est en Mode 0...
C'est là qu'interviennent nos réglages, que je vous avez demandé de bien noter... Pour ceux qui ont oublié de prendre des notes, ce n'est pas grave, vous utiliserez ce que moi j'ai utilisé...
En regardant plus précisément dans la documentation (le fichier ConvImgCpc.htm livré dans l'archive de ConvImgCPC), vous trouverez à la fin la liste des arguments possibles pour l'utilisation de ConvImgCPC en ligne de commande.
Pour notre exemple, nous avons utilisé pour le moment le paramètre -F, qui sert à définir le masque des fichiers à traiter. Nous allons ajouter les paramètres suivants: (Vous pouvez biensur remplacer ces paramètres par ceux que vous aviez notés.)

-M1 qui permettra de convertir les images en mode 1 (par défaut, elles le sont en mode 0),
-NX368 pour indiquer la taille en X à utiliser,
-NY272 pour indiquer la taille en Y à utiliser,
-T1 pour indiquer que nous voulons utiliser le tramage type 1,
-X2 pour indiquer que nous voulons utiliser la matrice de tramage 2x2,
-P50 pour indiquer que nous voulons 50% de tramage,
-Czebre.pal pour indiquer que nous voulons utiliser notre palette zebre.pal, que nous avions sauvegardé tout à l'heure.

Et pour ceux qui ont oublié de sauvegarder la palette ? Pas de panique ! Vous pouvez soit :
- Retourner dans l'interface de ConvImgCPC, rechercher la meilleure palette et la sauvegarder (mais bon, on va peut-être perdre du temps...)
- Soit indiquer à ConvImgCPC de calculer lui-même la palette, mais de garder la même palette pour toutes les images.

Cette dernière option est très intéressante, dans le cas où vous n'avez pas envie de vous embêter à rechercher vous même la meilleure palette.
Elle se traduit par l'option -L.

Retour dans notre ligne de commande DOS (on peut laisser PC-CPC ouvert), et cette fois ci, on tape :
ConvImgCPC -Fimage*.gif -M1 -NX368 -NY272 -T1 -X2 -P50 -Czebre.pal
Ou, pour ceux qui ont "oubliés" de sauvegarder la palette :
ConvImgCPC -Fimage*.gif -M1 -NX368 -NY272 -T1 -X2 -P50 -L
Et on laisse ConvImgCPC faire le travail...

On retape la mème ligne: MODE 1:LOAD"Image01.SCR":CALL&C7D0



Et là, l'image est beaucoups mieux, c'est bien les réglagles que l'on avait choisi !




Voila, maintenant nous avons nos 10 images .SCR. Pour animer notre zèbre, on pourrait faire un petit programme basic de ce genre :
10 MODE 1:BORDER 0:INK 0,0:INK 1,26:INK 2,15:INK 3,3
20 FOR i=1 TO 10:A$=MID$(STR$(i),2,2):IF i<10 THEN A$="0"+A$
30 LOAD "IMAGE"+A$+".SCR",&C000
40 NEXT i:GOTO 20
Si ce programme fonctionne bien avec PC-CPC et son mode accès direct au disque dur du PC, ça ne sera pas la même chose si on copie tous ces fichiers (par exemple, avec ManageDsk) sur un fichier DSK...
En effet, le temps de lire chaque fichiers sur la disquette procurera des effets assez désagréables à l'écran, en plus de la lenteur de l'animation...
L'idéal serait de charger les 10 images en mémoire et de les afficher en boucle une par une.
Mais bon, 10 images de 16Ko nous donne 160Ko... Même un 6128 ne peut gérér que 128Ko de Ram. Comment allons nous alors procérer ?
Et bien nous allons utiliser le compactage. Et comme PC-CPC dispose, grâce à la "rom pack", des rsx de compactage, cela va nous faciliter grandement la tache !

Je ne vais pas passer en revue ici tous les RSX que nous mets à disposition la Rom Pack de PC-CPC, mais seulement ceux qui nous seront utiles pour notre animation:

|PACKWINDIFF,adr_buffer,adr_longueur
Permet de compacter la fenêtre affichée sur le cpc en calculant automatiquement les coordonnées de celle-ci en fonction des différences entre l'image affichée à l'écran et l'image située à l'adresse adr_diff.
adr_buffer représente l'adresse où sera stockée l'imagecompactée, adr_longueur représente l'adresse où sera stockée sur 16 bits la longueur de l'image compactée. adr_longueur peut être l'adresse d'une variable basic entière (ex : @longueur%)

|INITBUFFDIFF,adr_buffer
Permet d'initialiser le buffer des différences inter-images. Ceci permet, lors du premier appel de |PACKWINDIFF, d'avoir un buffer initialisé avec un écran par défaut. En général, on pourra faire :
MODE 1:|INITBUFFDIFF,&C000

Pour entrer un peu plus dans le détail de ces RSX, il faut savoir que |PACKWINDIFF utilise un buffer interne de 16384 octets (la taille de la mémoire vidéo du cpc) et calcule les différences entre l'image affichée à l'écran et son buffer.
De là, il détermine les coordonnées de ce qui a changé à l'écran, et compacte le tout dans la mémoire du CPC. Et la dernière opération, il recopie ce qu'il y a à l'écran dans son buffer interne.
Ce qui fait que lorsque nous lirons une nouvelle image et réappelerons de nouveau le rsx |PACKWINDIFF, il pourra calculer les différences entre nos 2 images consécutives.
Je en sais pas si cette partie est bien claire pour vous, mais ce n'est pas trop grave pour appréhender la suite.

Maintenant que nous connaissons un peu mieux ces RSX, voici un petit programme qui permet de les utiliser :
10 MODE 1:BORDER 0:INK 0,0:INK 1,26:INK 2,15:INK 3,3
20 LOAD "IMAGE10.SCR",&C000:|INITBUFFDIFF,&C000
30 MEMORY &3FFF:l%=0
40 FOR i=1 TO 10:A$=MID$(STR$(i),2,2):IF i<10 THEN A$="0"+A$
50 LOAD "IMAGE"+A$+".SCR",&C000
60 |PACKWINDIFF,&4000,@l%
70 SAVE "IMAGE"+A$+".CMP",b,&4000,l%
80 NEXT i
Remarque: sur un CPC 6128 AZERTY, il faut remplacer le caractère '|' par 'ù', et le caractère '@' par 'à'.

Une petite chose peut vous sembler bizzare : pourquoi avoir fait un LOAD "IMAGE10.SCR",&C000 avant le |INITBUFF,&C000 ?
La réponse est simple : comme nous allons faire une animation qui reboucle (de l'image 1 à l'image 10), il est intéressant d'initialiser notre buffer avec l'image 10, car ainsi, lorsque l'on va lire l'image 1, le RSX calculera les différences entre l'image 10 et l'image 1.
Ceci peut vous sembler anodin, mais imaginez : l'objet de image 1 est plus petit que l'objet de l'image 10. Si on initialise le buffer sur un écran vide, les différences entre l'écran vide et l'image 1 seront uniquement l'image 1.
Lorsque notre animation va reboucler de l'image 10 à l'image 1, l'image 1 va s'afficher par dessus l'image 10, mais comme la taile de la fenêtre ne correspondra qu'à l'image 1 effective, il restera des "morceaux" de l'image 10 en dessous...
Pas très estéthique donc. Par contre, en utilisant cette astuce, le RSX calculera les différences entre l'image 10 et l'image 1, et la zone à compacter correspondra donc la plus grande des deux images.

Fin de cette petite explication.Un RUN, puis un CAT, et voici le résultat :



En plus des images .GIF et des images .SCR, voici maintenant les fichiers .CMP, qui représentent nos images compactées.
Tout ceci est bien, mais nous avons toujours le même problème : lire ces 10 images compactées depuis une disquette, même si chaque fichier ne fait qu'un Kilo-Octet (à peu près...), ça prends du temps !
L'idéal est donc de regrouper tous ces fichiers en un seul, pour le lire en une seule fois et jouer notre petite animation directement depuis la mémoire du CPC !
On va modifier légèrement notre programme, pour qu'il ressemble à ça :
10 MODE 1:BORDER 0:INK 0,0:INK 1,26:INK 2,15:INK 3,3
20 |INITBUFFDIFF,&C000
30 MEMORY &3FFF:l%=0:adr=&4000:DIM a(10)
40 FOR i=1 TO 10:A$=MID$(STR$(i),2,2):IF i<10 THEN A$="0"+A$
50 LOAD "IMAGE"+A$+".SCR",&C000
60 |PACKWINDIFF,adr,@l%
70 a(i)=adr:adr=adr+l%
80 NEXT i
90 SAVE "ZEBRE.CMP",b,&4000,adr-&4000
100 FOR i=1 TO 10:PRINT a(i)",";:NEXT
Voici le résultat:


A quoi correspondent ces chiffres me direz vous ? Et bien à l'adresse mémoire CPC à laquelle est enregistrée chaque image. Notez là bien, elle va vous servir pour faire le petit programme d'animation !
Nous avons maintenant notre fichier "ZEBRE.CMP" qui contient les 10 images compactées pour animer le zèbre. Mais comment faire pour l'animer ?
Simple, sur PC-CPC, il y a un RSX pour décompacter une fenêtre : |DEPKWIN,adr_buffer
Permet de décompacter la fenêtre stocké à l'adresse adr_buffer.

Plutôt que de longs discours, voici donc notre petit programme d'animation:
10 MODE 1:BORDER 0:INK 0,0:INK 1,26:INK 2,15:INK 3,3
20 MEMORY &3FFF:LOAD "ZEBRE.CMP",&4000
30 DIM a(10):FOR i=1 TO 10:READ a(i):NEXT i
40 FOR i=1 TO 10
50 FRAME:|DEPKWIN,a(i)
60 NEXT i:GOTO 40
70 DATA 16384,17122,17922,18793,19659,20517,21403,22229,22979,23744
REMARQUE: j'ai mis à la ligne 70 les DATAS qui correspondent à ce que le programme précédent a généré.
Il se peut que vos valeurs soient différentes, dus au réglages différents que vous avez effectués sur le calcul des images avec ConvImgCPC.
Veillez donc à bien prendre les valeurs que vous avez obtenues, plutôt que de recopier celles-ci.

Alors, prêt pour le RUN décisif ? ok, allez y !

Voilà ! L'animation fonctionne très bien !
Mais encore une petite chose: il serait impossible de l'utiliser telle quelle sur un autre émulateur cpc, ou même sur un vrai cpc...
En effet, le rsx |DEPKWIN utilisé pour l'affichage fait partie de la "rom pack" de PC-CPC, et ne peut être utilisé ailleur.
Heureusement, il existe un autre moyen pour afficher nos images : DEPKWIN.BIN !!!
Oui, le petit fichier dont le lien est donné au début de ce tutorial est en fait un fichier binaire qui fait la même chose que le rsx de PC-CPC.
Allons y, notre programme basic devient maintenant :
10 MODE 1:BORDER 0:INK 0,0:INK 1,26:INK 2,15:INK 3,3
20 MEMORY &3FFF:LOAD "ZEBRE.CMP",&4000:load"DEPKWIN.BIN,"&A500
30 DIM a(10):FOR i=1 TO 10:READ a(i):NEXT i
40 FOR i=1 TO 10
50 FRAME:CALL &A500,a(i)
60 NEXT i:GOTO 40
70 DATA 16384,17122,17922,18793,19659,20517,21403,22229,22979,23744
Avant de le lancer, assurez-vous que DEPKWIN.BIN se trouve dans le bon répertoire...
Roulements de tambour... RUN... Et oh ! Ca fonctionne !

Voilà, il ne vous reste plus qu'à :
- Sauvegarder le programme basic,
- Ecrire tous les fichiers (le programme basic, le fichier ZEBRE.CMP et le fichier DEPKWIN.BIN) dans un .DSK,
- Tester ça sur d'autres émulateurs, ou mieux, sur un vrai CPC !!!

Ce petit tutorial est terminé. J'espère qu'il vous aura éclairci sur le moyen de réaliser des petites animations.
Si vous avez des remarques ou des demandes d'explications complémentaires sur ce tutorial, n'hésitez pas à me contacter !