Tudom, már volt plazma effekt, akkor a paletta forgatásán alapult az egész. Most arról van szó, hogy palettaforgatás nélkül számoljuk a dolgot. Mégpedig 4 szinuszhullám összegezésével. Lesz két horizontális, és két vertikális hullám. Az egyirányú hullámok persze más frekvenciával mennek, így változatosabb az eredő hullám.

Tulajdonképpen nincs más dolgunk, mint pixelenként a négy színuszhullámot venni, és ebből átlagot vonni. Ez nagyon egyszerűen és gyorsan megy. Csak kell egy szinusz táblázat. Mivel majd úgyis 4-el kell osztani (az átlagolásnál), csak 64-el kell felszorozni. Így az egy pixelre jutó számolás pár mov és 4 add lesz. A legegyszerűbb a 256 elemű lenne, de legyen 512, mert így finomabb a mozgás. Egyszerű.

A négy hullám mozgatását pedig véletlenszerűen kell megoldani.

A használt képernyőmód nem szabványos. 80X400-as. A felbontás kicsinek tűnik, de egy ilyen effektnél nem a felbontás a lényeg. Az az előnye, hogy csak 16000 byte az egész képernyő, gyorsan ki lehet tölteni. Ha minden második sort kihagyunk, ez 8000 pixelre csökkenthető. Ezzel érdekes kinézetet tudunk kölcsönözni a programnak.

80X400 beállítása:

    procedure Init80X400X256; assembler; asm   mov ax,13h { set 320x200x256}   int 10h   mov dx,3C4h { Itt jon a portok atnyomasa}   mov ax,0604h { 80x400x256 mod.}   out dx,ax   mov ax,0F02h { enable 4-planes.}   out dx,ax   mov dx,3D4h { disable dword mode}   mov ax,0014h   out dx,ax   mov ax,0E317h { enable byte mode}   out dx,ax   mov ax,0009h { dup each scan }   out dx,ax   mov ax,0A000h   mov es,ax   xor di,di   mov cx,80*400 { clear video memory.}   mov ax,0   cld   rep stosw end;
Tulajdonképpen ezen nem sok magyarázni való van, ezt a képernyőmódot így kell csinálni.

A megfelelő kinézethez a felbontásnál is fontosabb egy jó paletta. És ez nem olyan egyszerű. Mivel Azt akarjuk, hogy a képen ne legyenek meghatározott vonalak (ezért hívják plazma effektnek), az egymás mellett lévő színek csak kis mértékben térhetnek el egymástól. Ezt még meg kell toldani azzal, hogy a paletta eleje folyjék össze a végével, hiszen mi van, ha egy 1 meg egy 255 kerül egymás mellé.
 

A paletttát úgy kell számolni, hogy különböző színtartományokra osztjuk. Az egyik ott ér véget, ahol a másik kezdődik. Átmennek egymásba. Valami hasonlónak kell lennie:

És így kell előállítani:

    Procedure FillPal; var c : integer; begin   pal[0].R:=0;pal[0].G:=0;pal[0].B:=0; {Hatterszin}   for c:=0 to 63 do  begin     pal[1+c].R:=63;     pal[1+c].G:=c;     pal[1+c].B:=63-c;   end;   for c:=0 to 63 do   begin     pal[65+c].R:=63-c;     pal[65+c].G:=63;     pal[65+c].B:=c;   end;   for c:=0 to 63 do   begin     pal[129+c].R:=0;     pal[129+c].G:=63-c;     pal[129+c].B:=63;   end;   for c:=0 to 62 do   begin     pal[193+c].R:=c;     pal[193+c].G:=0;     pal[193+c].B:=63;   end; end;

Ha ez megvan, már csak pixelenként ki kell számolni a képet. A négy hullámot egyenként követni, és minden egyes pixelnél átlagolni őket. Az átlagolás csupán négy összeadást jelent. Mivel minden hullám 0 és 64 közti értéket vesz fel, négyet összeadva pont egy 0 és 256 közti számot kapunk. Ez pedig ugye egy 256 színű módnál tökéletesen megfelel. Még annyi, hogy az átlagba még beledobtam egy kis véletlenszerű értéket, a változatosság végett.

    Procedure DoPlasma; var Hwpos1,Hwpos2,Vwpos1,Vwpos2 : integer; {Hullam poziciok} begin   Hwpos1:=Hpos1; {Kezdo poziciok atvetele }   Hwpos2:=Hpos2;   Vwpos1:=Vpos1;   Vwpos2:=Vpos2;   asm     mov ax,ScreenSeg     mov es,ax     mov ax,Ypos {di=screen address}     mov bx,Lsize     mul bx     add ax,Xpos     mov di,ax     mov si,offset sintab {si=sin table}     mov ah,rows @Yloop:     push ax     mov ah,coloumns     mov cx,Vwpos1     mov dx,Vwpos2 @Xloop:    xor bh,bh    mov al,r {random szam atvetele}    mov bx,cx    add al,[si+bx] {4 hullam osszegzese}    mov bx,dx    add al,[si+bx]    mov bx,Hwpos1    add al,[si+bx]    mov bx,Hwpos2    add al,[si+bx]    or al,1 {ne legyen nulla}    stosb {put pixel}    add cx,2 {incremenet Hpos1,Hpos2}    add dx,6    and cx,511    and dx,511    dec ah    jnz @Xloop    add di,slinc    add Hwpos1,1    add Hwpos2,2    and Hwpos1,511    and Hwpos2,511    pop ax    dec ah    jnz @Yloop   end; end;

Ilyen egyszerű. A hullámokat különböző frekvencián kell számolni, hogy az eredő ne legyen unalmas.

Erről ennyit.