Revenir au plan du site

Conversion d'images PNG vers écran, sprites soft, sprites hard


Je vous présente ici mon outil de conversion d'image. Attention à ne pas confondre traitement et conversion. Cet outil ne s'occupe que de conversion. Ce n'est pas un outil de traitement d'image comme peuvent être Martine, ConvIMGCPC ou UniPixelViewer. Ainsi, les images ne sont pas transformées ou dégradées. Selon ce que vous voulez faire, ce n'est peut-être pas l'outil qu'il vous faut.
Néanmoins, Martine est capable de convertir sans les altérer des images dont le nombre de couleurs est déjà réduit! Et comme Sid a eu la gentillesse de me fournir les commandes équivalentes, je vous les mets enn rab ;)

Téléchargement des outils :

Ça se passe [ici pour ConvGeneric]
Et [Là pour Martine]


Exemple de conversion d'un écran :



image mode 0 160x200

convgeneric.exe -m 0 ironMan.png -scr

martine -in ironMan.png -out ./ironman-test -mode 0

En sortie, vous avez besoin de la palette Gate Array générée et du fichier binaire ironMan.bin. Ensuite vous pouvez afficher votre écran comme avec le programme de l'article sur le changement de couleurs [ici].


Exemple de conversion d'un écran FullScreen pour CPC (plein écran, sans les bords) :



image mode 0 192x272

convgeneric.exe -m 0 ironManFS.png -scr -old -flat -w 96

martine -in ironMan.png -out ./ironman-test -mode 0 -fullscreen

En sortie, vous avez besoin de la palette Gate Array générée et du fichier binaire ironMan.bin qui fait pas loin de 32k (31936 octets pour être précis). Voici le source avec les réglages nécessaires à passer en plein écran avec l'overscan sur la lecture d'adresse.
buildsna
bankset 0
org #100
run #100

ld bc,#7F80+%1100 : out (c),c ; MODE 0

ld bc,#BC00+3 : out (c),c : ld bc,#BD00+#8C : out (c),c ; compatibilité Motorola pour le registre 2
ld bc,#BC00+1 : out (c),c : ld bc,#BD00+48 : out (c),c ; élargir l'écran
ld bc,#BC00+2 : out (c),c : ld bc,#BD00+50 : out (c),c ; déplacer l'écran à droite
ld bc,#BC00+6 : out (c),c : ld bc,#BD00+34 : out (c),c ; agrandir l'écran en hauteur
ld bc,#BC00+7 : out (c),c : ld bc,#BD00+35 : out (c),c ; déplacer l'écran vers le haut
ld bc,#BC00+12 : out (c),c : ld bc,#BD00+#2C : out (c),c ; début de la mémoire écran en #8000 + overscan

ld hl,palette : ld bc,#7F00
setPalette out (c),c : inc b : outi : inc c : ld a,c : cp 16 : jr nz,setPalette
jr $

palette defb #54,#47,#5C,#4C,#43,#4B,#4E,#5E,#40,#45,#58,#5B,#44,#46,#5F,#4F

org #8000 : incbin 'ironManFS.bin'


Exemple de conversion d'un écran FullScreen pour Plus avec rupture Plus :


La ligne de commande change, pas de -old par contre on va demander à couper l'écran à partir de la ligne 136 (la moitié de 272). Il est techniquement possible de monter jusqu'à 168. En fait vous coupez un peu où vous voulez tant que chaque page reste dans l'espace des 16k.

convgeneric.exe -m 0 ironManFS.png -scr -ls 136 -flat -w 96


martine -in ironMan.png -out ./ironman-test -mode 0 -fullscreen -plus


En sortie, vous avez besoin de la palette Gate Array OU Plus générée et du fichier binaire ironMan.bin qui fait pas loin de 32k (32352 octets pour être précis). Voici le source avec les réglages nécessaires à passer en plein écran.
buildsna
SNASET CPC_TYPE,4 ; 6128+
bankset 0
org #100
run #100

;*** RMR2 tags ***
ASICOFF equ 0
ROM0000 equ 0
ROM4000 equ %01000
ROM8000 equ %10000
ASICON equ %11000
ROM0 equ 0 : ROM1 equ 1 : ROM2 equ 2 : ROM3 equ 3 : ROM4 equ 4 : ROM5 equ 5 : ROM6 equ 6 : ROM7 equ 7
macro RMR2 tags
ld a,{tags}+%10100000
ld b,#7F
out (c),a
mend

ld bc,#7F80+%1100 : out (c),c ; MODE 0

ld bc,#BC00+1 : out (c),c : ld bc,#BD00+48 : out (c),c ; élargir l'écran
ld bc,#BC00+2 : out (c),c : ld bc,#BD00+50 : out (c),c ; déplacer l'écran à droite
ld bc,#BC00+6 : out (c),c : ld bc,#BD00+34 : out (c),c ; agrandir l'écran en hauteur
ld bc,#BC00+7 : out (c),c : ld bc,#BD00+35 : out (c),c ; déplacer l'écran vers le haut
ld bc,#BC00+12 : out (c),c : ld bc,#BD00+#20 : out (c),c ; début de la mémoire écran en #8000

call UnlockAsic
RMR2 ASICON

ld a,135 : ld (#6801),a ; rupture Plus à la ligne 136
ld hl,#0030 : ld (#6802),hl; adresse de l'écran pour la rupture Plus


ld hl,palette : ld bc,#7F00
setPalette out (c),c : inc b : outi : inc c : ld a,c : cp 16 : jr nz,setPalette
jr $

palette defb #54,#47,#5C,#4C,#43,#4B,#4E,#5E,#40,#45,#58,#5B,#44,#46,#5F,#4F

UnlockAsic
ld bc,#BCFF
out (c),c
out (c),0
ld hl,%1001000011101010
.loop
out (c),c
ld a,h:rlca:ld h,l:ld l,a
srl c:res 3,c
and #88
or c
ld c,a
cp #4D
jr nz,.loop
ld a,#CD
out (c),a : out (c),a
ret

org #8000 : incbin 'ironManFS.bin'


Exemple de conversion d'une planche de sprites :



convgeneric.exe -m 0 -size 26x74 -c 4 -flat sheetBaron.png

martine -in sheetBaron.png -split -mode 0 -spritesrow 4 -spritescolumn 1 -height 74 -width 26 -out ./test

Les paramètres :
- Le mode
- La taille en pixels des sprites à extraire
    (si c'est une taille qui ne tombe pas juste avec le nombre de pixels par octet, le dernier octet de la ligne sera complété avec zéro)
- Le nombre maximum de sprites à extraire (par défaut : 1)
- L'option flat pour éviter que l'outil découpe en morceaux de 16K (ça n'était pas indispensable ici)
- L'image en PNG

Ici la largeur de 26 pixels en mode 0 va résulter des données de sprite d'une largeur de 13 octets. Vous pouvez charger le fichier dans ACE avec l'explorateur mémoire et utiliser l'explorateur graphique pour valider que la conversion s'est bien passée.


Allez, on va se l'animer le baron!
buildsna
bankset 0
org #38
ei : ret
org #100
run #100
ei
ld sp,#100
ld bc,#7F80+%1100 : out (c),c ; MODE 0
ld hl,palette : ld bc,#7F00
setPalette out (c),c : inc b : outi : inc c : ld a,c : cp 15 : jr nz,setPalette

debut
ld hl,baron : call affiche_sprite
call affiche_sprite
call affiche_sprite
call affiche_sprite
jr debut

affiche_sprite
ld b,30
; grosse pause, nous avons peu d'étapes d'animation
.pause halt
djnz .pause
ld de,#C000+80*5+34 ; pour être à peu près centré
ld a,74
.copyLines
push de
ldi 13
pop de
ex hl,de
ld bc,#800 : add hl,bc : jr nc,.novf
ld bc,80-#4000 : add hl,bc
.novf
ex hl,de
dec a
jr nz,.copyLines
ret

; moins de 16 couleurs, attention à ne jamais envoyer un octet de plus! Ou alors ajoutez une couleur bidon pour compléter
palette defb #5B,#4C,#5C,#47,#54,#4B,#40,#46,#56,#4E,#52,#5E,#43,#44

baron incbin 'sheetBaron.bin'




Exemple de conversion d'une planche de sprites hard :


ConvGeneric est capable de convertir simplement des planches de sprites sans qu'il soit nécessaire de tout éclater en sprites unitaires. Par exemple la planche ci-dessous compose chaque personnage avec 9 sprites organisés en carré de 3x3. L'image doit contenir la transparence là où le sprite hard sera transparent.

Et voici le 'vrai' fichier planche

Vous pourrez aussi avoir besoin de ça pour jouer avec ;)

convgeneric.exe -hsp -meta 3x3 -k -flat metalSheet15.png -c 36 -p 2
convgeneric.exe -scr -m 0 metalBackground.png

martine -in metalSheetZoom.png -split -mode 0 -spritesrow 12 -spritescolumn 3 -height 16 -width 16 -plus -spritehard -out ./metal
martine -in metalBackground.png -plus -mode 0 -out ./metal

Les paramètres :
- pas besoin de spécifier le mode, il n'y a que du 15 couleurs + transparence
- l'option meta permet de définir la forme de notre sprite, c'est optionnel
- l'option k permet de produire des sprites vides si il y en a, ça peut être pratique pour évité d'être décalé sur une série (ici non)
- l'option flat pour tout sortir d'un coup et ne pas multiplier les fichiers
- le limiteur de nombre de sprite (ça compte en sprites tout court et pas en meta, enfin je crois ^_^)
- enfin, l'option -p 2 pour grouper les pixels par 2 (4bits+4bits, on va voir comment les traiter)

Il n'est pas obligatoire de grouper les pixels par 2, c'est un exemple pour montrer comment gagner facilement de la place.

Et le petit source de démonstration (avec les fichiers à préparer)
buildsna
SNASET CPC_TYPE,4 ; 6128+
bankset 0
org #38
ei : ret
org #100
run #100

;*** RMR2 tags ***
ASICOFF equ 0
ROM0000 equ 0
ROM4000 equ %01000
ROM8000 equ %10000
ASICON equ %11000
ROM0 equ 0 : ROM1 equ 1 : ROM2 equ 2 : ROM3 equ 3 : ROM4 equ 4 : ROM5 equ 5 : ROM6 equ 6 : ROM7 equ 7
macro RMR2 tags
ld a,{tags}+%10100000
ld b,#7F
out (c),a
mend

ld sp,#100 ; la pile avant le code
ld bc,#7F80+%1100 : out (c),c ; MODE 0

call UnlockAsic
RMR2 ASICON

ld hl,palette
ld de,#6400
ld bc,64
ldir ; on envoie toutes les couleurs d'un coup, fond, border, sprites
ei

; activer 9 sprites en ratio mode 1
ld a,%1001
ld hl,#6004 : ld b,9 : ld de,8
.setHsp ld (hl),a : add hl,de : djnz .setHsp

; il faut positionner nos sprites
ld hl,200 : ld (#6000+8*0),hl : ld (#6000+8*3),hl : ld (#6000+8*6),hl
ld hl,232 : ld (#6000+8*1),hl : ld (#6000+8*4),hl : ld (#6000+8*7),hl
ld hl,264 : ld (#6000+8*2),hl : ld (#6000+8*5),hl : ld (#6000+8*8),hl
ld hl,132 : ld (#6002+8*0),hl : ld (#6002+8*1),hl : ld (#6002+8*2),hl
ld hl,148 : ld (#6002+8*3),hl : ld (#6002+8*4),hl : ld (#6002+8*5),hl
ld hl,164 : ld (#6002+8*6),hl : ld (#6002+8*7),hl : ld (#6002+8*8),hl

;=================
animation
;=================
ld hl,hspack : call spriteUnpack
push hl : call spriteUnpack
push hl : call spriteUnpack
call spriteUnpack
pop hl : call spriteUnpack
pop hl : call spriteUnpack
jr animation
;-------------------
spriteUnpack
ld b,30
.attend halt : djnz .attend
ld de,#4000 ; adresse des données des sprites dans l'ASIC
ld b,9 ; on veut décompresser 9 sprites
.loop
ld a,(hl) : ld (de),a : inc e ; copier le premier octet (les 4 bits du haut seront ignorés)
rrca : rrca : rrca : rrca : ld (de),a : inc e ; copier le deuxième octet
inc hl ; données crunchée suivante
jr nz,.loop
inc d ; sprite suivant, ils font 256 octets
djnz .loop
ret

UnlockAsic
ld bc,#BCFF
out (c),c
out (c),0
ld hl,%1001000011101010
.loop
out (c),c
ld a,h:rlca:ld h,l:ld l,a
srl c:res 3,c
and #88
or c
ld c,a
cp #4D
jr nz,.loop
ld a,#CD
out (c),a : out (c),a
ret


palette defw #332,#7B3,#794,#8A6,#212,#341,#110,#673,#AD3,#462,#443,#5A0,#CDA,#380,#4C0,#7E0
 border defw #000
    hsp defw #110,#330,#240,#342,#547,#673,#675,#692,#859,#8B0,#9D4,#AB8,#CF8,#D9E,#FFE

org #8000 : hspack incbin 'metalSheet15.bin'
org #C000 : incbin 'metalBackground.bin'


Exemple de conversion d'une carte en Atlas et tileMap :


On précise la taille souhaitée des tuiles, le nom de la map, l'option tiles et le logiciel s'occupe de calculer les tuiles et produire un fichier tileMap à inclure en ascii (une suite de DEFB ou DEFW dépendant du nombre de tuiles dans l'atlas)
Bien sûr, il y a aussi un export de la palette et aussi une preview de l'Atlas pour valider que tout semble OK.
convgeneric.exe -m 0 -g -tiles -size 8x16 Map16.png

martine -in tileSheetVertical.png -plus -width 8 -height 16 -mode 0 -reducer -1 -tilemap -out ./tilemap

Preview de l'atlas produit par la commande
Pour voir un exemple d'utilisation de cette tileMap, vous pouvez lire [l'article sur les scrollings verticaux avec l'ASIC]