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]