Nézzük mit takar ez a hangzatos anglius beütésű kifejezés. Nem mást, mint az egymás után következő fázisok összemosását. Ez egy nagyon cseles dolog, be lehet vele csapni a szemünket. Ha túl lassan, nagy léptékben mozgatunk egy valamit (alacsony a frame rate), akkor az bizony szaggatni fog. Azonban, ha az előző pár fázist kint hagyjuk, és egy picit fade-ljük, máris elmostuk annak a valaminek a körvonalait, és nem érezzük a szaggatást. Érthető nem ? Persze ! Érthető lenne, ha megmondanám mi az a fade-elés. Valami olyasmi, hogy elsötétítés, halványítás. 

Hogy lehet ezt elérni: elég egyszerű (ezért ezzel foglalkozom). Felosztjuk a palettát annyi részre, ahány fázisunk van , mindegyik rész annyi elemű, ahány színű az objectünk. Tehát 256 színű módban egy 64 színű objectnek max 3 fázisa lehet. Hogy miért nem 4 ? Mert abból a 256 színből 1, a háttérszín kiesik így 255 marad. Ezért ha mondjuk 4 fázist akarunk, 63 színnel be kell érnünk. Ennyit az objectről. Nézzük a palettát. Úgy kel kinéznie, ugyi, hogy fel van osztva annyi részre ahány fázis van. Persze nem kötelező az egész palettát felhasználni, kinek, mihez van kedve. Az első részben legyenek az eredeti színek, a következőben az egyel sötétítettek, és így tovább. Ilyen palettát nem is olyan nehéz összehozni. Általánosságban elmondhatjuk, úgy tudunk egy színt sötétíteni, hogy minden színösszetevőjéből kivonunk egyet (persze, csak ha az illető összetevő már nem nulla). De elég pofás dolgokat lehet úgy is összehozni, ha csak egyik másik összetevőt, vagy adott arányban sötétítünk. mindenki kedve szerint.

Akkor van egy valahány színű cuccunk, amivel el akarunk játszani, és van egy tuti palettánk. Nézzünk: kiteszem a képernyőre, fade-lek, kiteszem, fade-lek..... 

No. Itt a fadelés-t több féle képpen el lehet érni. 

Első változat:

Elég csak eltolni a palettát annyival lejjebb, ahány színű az object (egy résznyivel). Az alul kicsorgó rész meg ugrik vissza a paletta végére. Röviden: paletta forgatás. 
 

p
rocedure
RotatePal; var buf: Array[1..3] of Byte; begin
move(paletta, buf, 3); move(paletta[3], paletta, 9); move(buf, paletta[9], 3);
end;

A dolog ismerős a plasma-effektből ugye! Annyi a különbség, hogy ott mindig csak egy színnel toltunk el. A forgatás miatt, azonban az eredeti színek háttrébb csúsztak a palettán. Ezért a következő fázisban már minden színhez hozzá kell adni annyit amennyivel el van tolva a paletta.(ahány színű az object* fázis) Eddig viszonylag egyszerű. Rajzolunk és palettát forgatunk. De nem árt gondoskodni arról sem, hogy az utolsó fázist törölni kell a képről, hiszen a következő palettaforgatás után már nem halványodna, hanem újból normál színű lenne. Mivel azonban egyszer minden fázis utolsó lesz, ahhoz, hogy akkor majd törölni tudjuk el kell tárolni a koordinátáit. Tehát a palettán és az objecten kívúl kell egy tömb is, ami annyi elemű ahány fázis van. Ennyit változott a játék: törlöm az utolsót, kiteszem a következőt, palettát forgatok.

Az elv nagyjából ennyi. 

A program az érthetőség egyszerűség, és főleg a magam kímélése érdekében igencsak egyszerű lett.

forrkod1.zip

Gondolom mindenki örömére a példaprogram a Pascal Graph unitját használja, csak 2 asm rutin van benne, és egy nem nagyon esztétikus (egy kitöltött téglalap) egyszínű dolgot mozgat. Remélem így sokkal jobban lehet érteni. Hiszen a lényeg a lényeg. Ha ettől mégsem lett érthetőbb a dolog, az sem baj, arra jó volt, hogy nem strapáltam magam mindenféle bigyuszok rajzolgatásával.

Második lehetőség:

A paletta forgatása helyett a képernyőn már kint lévő pixelek színéből vonunk ki annyit, hogy a az adott szín következő árnyalata legyen. Ha elértük a leghalványabb színt, háttérszínt rakunk ki, ezzel töröltük a legutolsó fázist. A módszer egyértelmű előnye, hogy nem kell törődni a fázisok eltárolásával.

 
procedure blur; assembler; asm
push ds mov ds, ScreenSeg xor si,si mov cx,64000 mov al,0 @cik: cmp [si],al jz @tov mov ah,[si] dec ah mov [si],ah @tov: inc si loop @cik @ki: pop ds
end;

Az eljárás addig csökkenti minden pixel színét, míg 0 nem lesz.

forrkod2.zip

A program egy egyszerű drótkockát forgat.