Revenir au plan du site

Fondu de couleurs


On va reprendre notre source d'initiation qui règle la palette d'une image et on va essayer différentes méthodes pour afficher notre image en partant du noir.

Première méthode avec des encres triées du plus sombre au plus clair :
- On prend la première couleur et on la propage aux restantes
- On prend la deuxième couleur et on la propage aux suivantes
- ...

Ainsi, les dernières couleurs (les plus lumineuses) seront passées d'abord par toutes les plus sombres, c'est la méthode que j'ai utilisée pour l'affichage de l'écran titre du jeu Léon Marchand. Pensez à récupérer le [fichier image] avant d'assembler ce source.
BUILDSNA : BANKSET 0
ORG #100
RUN #100

recommence
; toutes les encres au noir
ld bc,#7F00 : ld e,#54
toBlack
out (c),c : inc c
out (c),e
ld a,c : cp 17 : jr nz,toBlack
ld bc,#7F80+%1100 : out (c),c ; utiliser le mode 0
call tempo

ld e,1 ; notre limiteur
fonduEnOuverture
; attendre la VBL
ld b,#F5
.noVBL in a,(c) : rra : jr c,.noVBL
.VBL in a,(c) : rra : jr nc,.VBL


ld hl,palette_image
ld bc,#7F00
xor a
.setRealColor out (c),a : inc a : inc b : outi
cp e : jr z,.propageSuivantes
cp 17 : jr nz,.setRealColor
jr .termine
.propageSuivantes
dec hl ; revenir à l'encre précédente
out (c),a : inc a : inc b : outi
cp 17 : jr nz,.propageSuivantes
inc e : ld a,17 : cp e : jr z,.termine
jr fonduEnOuverture

.termine
call tempo
jr recommence

tempo
ld a,10 : ld bc,0
.loop djnz $ : dec c : jr nz,.loop : dec a : jr nz,.loop
ret

palette_image defb #54,#5C,#44,#56,#58,#40,#4C,#55,#52,#57,#45,#4E,#4A,#43,#5B,#4B
border defb #4B ; couleur la plus claire répétée
ORG #C000 ; mémoire vidéo
incbin 'leonMarchand.bin'

Le résultat est passable à vitesse réelle (50Hz) malgré le clignotement, mais si on regarde au ralenti, on voit que c'est vraiment du n'importe quoi...
 


Dans les liens du site, je mentionne le site de Super Sylvestre qui a écrit un bon article sur les fondus. Je vais prendre une de ses méthodes (le fondu RGB) et l'appliquer à notre image pour voir si le résultat est meilleur.

Je le cite lorsqu'il parle d'un fondu en fermeture : "Je conseille de commencer à dégrader le vert, puis le rouge, et finir par le bleu, de façon à avoir quelques chose d'apparemment plus proportionnel."

On va appliquer sa méthode à chaque couleur, c'est parti :)

Vous savez que les couleurs du basic sont triées (relisez le tableau des couleurs) en base 3 avec le bleu en unité, le rouge puis le vert. Ce programme va parcourir les couleurs dans l'ordre du basic, et descendre d'abord le vert (dans la limite de la quantité de vert disponible), et ainsi de suite pour les autres composantes.
On se retrouve avec 7 valeurs par encre (parfois avec des répétitions). Charge à nous de retrouver nos encres ensuite.
macro compose,lerouge,levert,lebleu
defb soft2hard_ink({lebleu}+{lerouge}*3+{levert}*9)
mend

startingindex 0
repeat 3,vert
repeat 3,rouge
repeat 3,bleu
; on va parcourir toutes les encres
tmprouge=rouge : tmpvert=vert : tmpbleu=bleu
compose tmprouge,tmpvert,tmpbleu ; encre de base
; on essaie 2 fois de descendre le vert
repeat 2
if tmpvert>0 : tmpvert-=1 : endif
compose tmprouge,tmpvert,tmpbleu
rend
; on essaie 2 fois de descendre le bleu
repeat 2
if tmpbleu>0 : tmpbleu-=1 : endif
compose tmprouge,tmpvert,tmpbleu
rend
; on essaie 2 fois de descendre le rouge
repeat 2
if tmprouge>0 : tmprouge-=1 : endif
compose tmprouge,tmpvert,tmpbleu
rend
rend
rend
rend

Je vais vous faciliter le travail, les 189 octets produits par le source précédent organisés en texte avec de jolis DEFB.
; table de couleurs pour fondu en fermeture (ordre basic)
defb #54 , #54 , #54 , #54 , #54 , #54 , #54
defb #44 , #44 , #44 , #54 , #54 , #54 , #54
defb #55 , #55 , #55 , #44 , #54 , #54 , #54
defb #5C , #5C , #5C , #5C , #5C , #54 , #54
defb #58 , #58 , #58 , #5C , #5C , #54 , #54
defb #5D , #5D , #5D , #58 , #5C , #54 , #54
defb #4C , #4C , #4C , #4C , #4C , #5C , #54
defb #45 , #45 , #45 , #4C , #4C , #5C , #54
defb #4D , #4D , #4D , #45 , #4C , #5C , #54
defb #56 , #54 , #54 , #54 , #54 , #54 , #54
defb #46 , #44 , #44 , #54 , #54 , #54 , #54
defb #57 , #55 , #55 , #44 , #54 , #54 , #54
defb #5E , #5C , #5C , #5C , #5C , #54 , #54
defb #40 , #58 , #58 , #5C , #5C , #54 , #54
defb #5F , #5D , #5D , #58 , #5C , #54 , #54
defb #4E , #4C , #4C , #4C , #4C , #5C , #54
defb #47 , #45 , #45 , #4C , #4C , #5C , #54
defb #4F , #4D , #4D , #45 , #4C , #5C , #54
defb #52 , #56 , #54 , #54 , #54 , #54 , #54
defb #42 , #46 , #44 , #54 , #54 , #54 , #54
defb #53 , #57 , #55 , #44 , #54 , #54 , #54
defb #5A , #5E , #5C , #5C , #5C , #54 , #54
defb #59 , #40 , #58 , #5C , #5C , #54 , #54
defb #5B , #5F , #5D , #58 , #5C , #54 , #54
defb #4A , #4E , #4C , #4C , #4C , #5C , #54
defb #43 , #47 , #45 , #4C , #4C , #5C , #54
defb #4B , #4F , #4D , #45 , #4C , #5C , #54

Revenons à nos moutons, nous avons une image, nous avons une palette, il nous faut extraire l'information utile de cette table et l'appliquer à notre palette.
palettes_finales
              defb #54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54
              defb #54,#54,#54,#54,#54,#54,#5C,#54,#54,#54,#5C,#5C,#5C,#5C,#54,#5C
              defb #54,#5C,#54,#54,#5C,#5C,#4C,#54,#54,#54,#4C,#4C,#4C,#4C,#5C,#4C
              defb #54,#5C,#54,#54,#5C,#5C,#4C,#44,#54,#44,#4C,#4C,#4C,#4C,#58,#45
              defb #54,#5C,#44,#54,#58,#58,#4C,#55,#54,#55,#45,#4C,#4C,#45,#5D,#4D
              defb #54,#5C,#44,#54,#58,#58,#4C,#55,#56,#55,#45,#4C,#4E,#47,#5F,#4F
              defb #54,#5C,#44,#56,#58,#40,#4C,#55,#52,#57,#45,#4E,#4A,#43,#5B,#4B

palette_image defb #54,#5C,#44,#56,#58,#40,#4C,#55,#52,#57,#45,#4E,#4A,#43,#5B,#4B ; reference

On a 7 palettes correspondant à notre fondu. Nous allons simplement les parcourir (lentement). Comme on le voit, ici le plus difficile est la préparation des données, de sorte qu'on ait une succession cohérente de couleurs. Le code se contentera de bêtement lire une table, puis une autre...
BUILDSNA : BANKSET 0
ORG #100
RUN #100

ld bc,#7F80+%1100 : out (c),c ; utiliser le mode 0
recommence
ld hl,palettes_finales
ld d,7 ; 7 palettes à faire
.bouclePalette
ld bc,#7F00
.boucleCouleur
out (c),c : inc c : inc b : outi : ld a,c : cp 17 : jr nz,.boucleCouleur
ld e,3
ld b,#F5
.noVBL in a,(c) : rra : jr c,.noVBL
.VBL in a,(c) : rra : jr nc,.VBL
dec e : jr nz,.noVBL
dec d : jr nz,.bouclePalette
call tempo
jr recommence


tempo
ld a,10 : ld bc,0
.loop djnz $ : dec c : jr nz,.loop : dec a : jr nz,.loop
ret

palettes_finales
              defb #54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54,#54
              defb #54,#54,#54,#54,#54,#54,#5C,#54,#54,#54,#5C,#5C,#5C,#5C,#54,#5C,#5C
              defb #54,#5C,#54,#54,#5C,#5C,#4C,#54,#54,#54,#4C,#4C,#4C,#4C,#5C,#4C,#4C
              defb #54,#5C,#54,#54,#5C,#5C,#4C,#44,#54,#44,#4C,#4C,#4C,#4C,#58,#45,#45
              defb #54,#5C,#44,#54,#58,#58,#4C,#55,#54,#55,#45,#4C,#4C,#45,#5D,#4D,#4D
              defb #54,#5C,#44,#54,#58,#58,#4C,#55,#56,#55,#45,#4C,#4E,#47,#5F,#4F,#4F
              defb #54,#5C,#44,#56,#58,#40,#4C,#55,#52,#57,#45,#4E,#4A,#43,#5B,#4B,#4B

ORG #C000 ; mémoire vidéo
incbin 'leonMarchand.bin'

Je vous laisse juger du résultat sur la preview, mais surtout sur un CPC ;)