lettres en feu

voici un petit effet simple est trés impressionnant, afficher des lettres enflammé ! en 320x200 et 256 couleur

non jean kevin, on fera pas de tete de mort enflammé !

là c'est pas trés impressionnant parce que ça bouge pas ! mais normalement ça fait un beau H=EDM2 en flammes !

Premiere etape : theorie : smooth vertical
La théorie, c'est quand on comprend mais que ça ne marche pas.

comment ça marche ?

en fait c'est tout con ça repose sur une chose essentielement.
pour calculer chaque pixel on fait la moyenne des pixel qui se trouve en dessous comme ça :
O represente le pixel dont on veut determiner sa couleur
X sont les points necessaire pour calculer sa couleur

X O X
X X X
X X X

on fait la moyenne des couleur de tout les X et on obtient la couleur de O

Deuxieme etape : pratique : les lettres !
La pratique, c'est quand ça marche mais que l'on ne comprend pas.

pour dessiner les lettres ? pas de casse tete juste 1 adresse ! une adresse ? YES ! mais quel adresse ?

F000F:A6EL

comment donc afficher les lettres grace a cette adresse ? et bin comme ça :
vram correspond a l'adresse de la memoire video

void BltText(char far *text, int x, int y, unsigned char color,unsigned char G){
int offset = (y <<
8) + (y<<6) + x, oldx=x;
unsigned char far *romptr, *charset = (unsigned char far*)
0xF000FA6EL;
romptr = charset + (*text) *
8;
unsigned char mask =
0x80;
while(*text != NULL){

for(int j = 0; j<8; j++){

mask = 0x80;
for(int k =
0; k<G*8; k+=G){

if(*romptr & mask)

for(int xx = 0;xx<G;xx++)

for(int yy = 0;yy<G;yy++)

vram[offset + k + xx +(yy*320)] = color;

mask = (mask >> 1);

}

offset += 320*G;
romptr++;

}

x += G*8;
text++;

if(text[0] == 13){

text++;
y+=
10*G;
x=oldx;

}

offset = (y<<8) + (y<<6) + x;
romptr = charset + (*text) *
8;
}
}

maintenant voyons voir pour notre feu, il nous faut une palette mais pas une pallette de 256 couleur car j'ai essayai et c trop long a gerer une grosse palette !

on va donc utiliser une pallette de 33 couleur ! pourquoi 33 ? parce que 666 c'est le chiffre du diable et que si on le divise par 2 ça donne 333 et si on enleve 300 ça donne 33 ! mon explication vous convient ? non ? tant pis !

bref il nous faut du jaune et du rouge donc voila le code :

void palette_degrader(void){
int B=
0,G=0,R=0;
bool c1=false,c2=false;
for (int i=
33;i>0;i--){
outp(
0x3C8, i);
outp(
0x3C9, R);
outp(
0x3C9, G);
outp(
0x3C9, B);

if ((R<
60)&&(!c1)) R=R+10;
if ((G<
60)&&(!c1)) G=G+5;
if ((G>=
60)&&(!c1)) c1=true;
if ((G>
0)&&(c1)&&(!c2)) G=G-10;
if (G<
0) G=0;
if ((G==
0)&&(c1)&&(!c2)) c2=true;
if ((R>
0)&&(c2)) R=R-3;
if (R<
0) R=0;
if ((R==
0)&&(c2)) c2=true;
}
}

voila, le code est nul a chiez mes c'est pas grave :) !

vous pouvez inverser R et G et ainsi obtenir un superbe effet :

trop top puissant :)

 

Troisiéme etape : la gestion graphique :

et oui car on va pas utiliser ces saloperie de BGI la con !
on va utiliser le celebre mode 13h !

pour ouvrir ce mode il faut faire :

mov AH,0
mov AL,0x13
int 10h

et pour le fermer :

mov AH,0
mov AL,0x03
int 10h

mais vous voyez, c'est de l'asm ! et c'est pour ça que c'est bien :) !

pour placer un pixel sur l'ecran a l'emplacement x,y, on fait :
vram[x+y*320]=couleur du point;
c pas super simple ça ? :)

Quatriéme etape : rapidité :

la memoire video n'est pas top super rapide en plus ecrire dessus point par point pendant que l'ecran est en train d'afficher le truc, c pas super ! :)

alors au lieu d'ecrire sur la memoire video, on va ecrire sur la ram ! c tout simple rappeler vous notre pointeur "vram" pointe sur la memoire video, ils suffit donc de lui dire de pointer autre part ! et aprés on copie tout dans la memoire video !

pour pointer autrepart on fait ça :

vram = (unsigned char far*)farmalloc(70000L);

pour copier la page à l'ecran :

unsigned char far* scrn = (unsigned char far *)0xA0000000L;
unsigned char far* virscrn = &vram[0];
asm{
push ds
les di, scrn
lds si, virscrn
mov cx, 35000
rep movsw
pop ds
}

pour liberer la ram et faire pointer "vram" sur la memoire video :

farfree(vram);
vram = (unsigned char far*)0xA0000000L;

Cinquiéme etape : Conclusion
Souvent théorie et pratique se rejoignent: rien ne marche et on n'y comprend rien.

ouep bah je crois que tout est dit ... j'ai surement oublié plein de truc, mais j'espere que tout le monde a compris, la source est livré avec dans : fire.zip

pour tout commentaire, croqmort@ifrance.com

je tient a remercier : Pri$m pour ses documents sur le mode 13h

CROQMORT