Farbpalettenwechsel

Das Programm, das in diesem Artikel vorgestellt wird, soll zeigen, wie Sie in Ihren Programmen Farbpalettenänderungen dazu benutzen können, um z.B. Zeichnungen zu animieren oder schöne Farbeffekte auf dem Monitor darzustellen.

Wenn man auf dem Bildschirm zeichnet, ist es notwendig, die Farbe anzugeben, mit der gezeichnet werden soll. Es ist die Farbnummer (0-15), die, wenn sie auf dem Bildschirm angezeigt wird, durch die Benutzung der Palette umgewandelt wird. Weil diese Aktion mit sehr hoher Geschwindigkeit abläuft, sind Veränderungen in der Palette sofort auf dem Bildschirm zu erkennen.

Für Animationen ist es charakteristisch, daß Bilder auf dem Monitor schnell wechseln, ohne daß man sieht, wie sie aufgebaut werden. Dieser Effekt ist z.B. dadurch möglich, daß man die Palette ändert. Natürlich dauert es immernoch genau so lange, ein Bild aufzubauen, aber der Effekt läßt sich für den Anwender des Programms unsichtbar programmieren.

Um unsichtbare Linien zu ziehen, muß man eine Farbe verwenden, die man vom Hintergrund nicht unterscheiden kann. Deshalb ist es notwendig, die Anzahl der Farben auf zwei oder vier zu beschränken. Im Beispiel-Animationsprogramm werden vier Farben benutzt, was bedeutet, daß zwei Figuren animiert werden können (44 = 16 Farben). Durch die Benutzung von lediglich 2 Farben lassen sich vier Figuren animieren (2222).

Nehmen wir an, daß zwei Figuren auf dem Bildschirm zur Darstellung kommen. Wir wollen die Bilder jeweils einzeln anzeigen. Das erste Bild wird in den Farben 0,1,2 und 3 dargestellt, das andere in den Farben 0, 4, 8 und 12. Beim Aufbau des Bilds muß der Schreibmodus entweder auf OR oder auf XOR gestellt werden. Dadurch verhindert man, daß das zweite Bild das erste zerstört.

Durch das Tauschen der Paletten (0,9,2,3,0,9,2,3,0,9,2,3,0,9,2,3), (0,0,0,0,9,9,9,9,2,2,2,2,3,3,3,3) und (0,9,2,3,2,9,2,3,2,9,2,3,0,9,2,3) können die beiden Bilder separat angezeigt werden. Diese Werte kamen zustande durch das Prüfen der Bitpattems, die mit 4 Bits möglich sind. Das erste Bild benutzt die Bits XX, während das andere die Bits YY verwendet. Die möglichen Kombinationen sind dabei XX00, XX01, XX11, XX10, 00YY, 01YY, 10YY und 11YY.

Die Graph unit-Routine GetPalette(var Pal:PaletteType) meiner Maschine gibt die folgenden Werte zurück: (0,1,2, 3,4,5,6,7,8,9,10,11,12,13,14,15). 0 ist dabei schwarz, 1 =...

Das Animationsprogramm schaltet zwischen zwei Bildern hin und her. Das Palettenprogramm erstellt einige psychedelische Grafiken. Beide Programme setzen natürlich einen Farbmonitor voraus.

Program PaletteDemo; (* MAXON Pascal *) 

Uses Graph;

Const
        MulFact = 0.0174532925;
Var
        o,p,m,a,
        Hx,Hy,
        Driver,
        Mode    : Integer;
        Rad     : Extended;
        Pal     : PaletteType;
Begin
    Driver  := StColor;
    Mode    := StLow;
    InitGraph(Driver,Mode,'');
    Hx      := GetMaxX DIV 2;
    Hy      := GetMaxY DIV 2;

    { Draw lines }
    For A := 1 to 360 Do 
    Begin
        Rad := MulFact*A;
        MoveTo(Hx,Hy);
        O := A Mod GetMaxColor;
        For P := 1 to 4 Do 
        Begin
            SetColor(O);
            M := 8+15*P;
            LineRel(Round(M*Sin(Rad)),Round(M*Cos(Rad)));
            O := GetMaxColor-O;
        End;
    End;
    { Play with palette }
    GetPalette(Pal);
    With Pal Do 
        Repeat 
            Delay(50);
            M := Colors[1];
            For A := 1 to GetMaxColor-1 do 
                Colors[A] := Colors[A+1];
            Colors[GetMaxColor] := M; 
            SetAllPalette(Pal);
        Until keypressed;
        CloseGraph;
    End.
Program Animate; (* MAXON Pascal *)

uses Graph;

Const
    Snow=false;
Var
    n,driver,mode   : Integer;
    P1,P2,P3        : PaletteType;

begin
    FillChar(P1,SizeOf(P1)*3,0);
    With P1 Do begin 
        Size := 16;
        Colors[1]:=9;Colors[2]:=2;Colors[3]:=3;
        Colors[5]:=9;Colors[6]:=2;
        Colors[7]:=3;Colors[9]:=9;Colors[10]:=2; 
        Colors[11]:=3;Colors[13]:=9;
        Colors[14]:=2;Colors[15]:=3;
    End;
    With P2 Do begin 
        Size := 16;
        Colors[4]:=9;Colors[5]:=9;Colors[6]:=9;
        Colors[7]:=9;Colors[8]:=2;
        Colors[9]:=2;Colors[10]:=2;Colors[11]:=2; 
        Colors[12]:=3;Colors[13]:=3;
        Colors[14]:=3;Colors[15]:=3;
    End;
    With P3 Do begin 
        Size := 16;
        Colors[1]:=9;Colors[2]:=2;Colors[3]:=3;
        Colors[4]:=2;Colors[5]:=9;
        Colors[6]:=2;Colors[7]:=3;Colors[8]:=2;
        Colors[9]:=9;Colors[10]:=2;
        Colors[11]:=3;Colors[13]:=9;Colors[14]:=2; 
        Colors[15]:=3;
    End;

    Driver := StColor;
    Mode := StMedium;
    InitGraph(Driver,Mode,'');

    SetWriteMode(XORPut);
    SetColor(2); Rectangle(220,10,250,40); {Control boxes}
    SetColor(8); Rectangle(220+50,10,250+50,40); 
    repeat
        n:=1-1; SetColor(8); Rectangle(n+1,n+1,n+181,n+181);
        for n:=1 to 20 do begin
            SetColor(2); Rectangle(n,n,n+180,n+180); 
            if not Snow then SetAllPalette(P3); {Show both}
            SetAllPalette(P1); Delay(10);
            SetColor(8); Rectangle(n,n,n+180,n+180); 
            SetColor(8); Rectangle(n+1,n+1,n+181,n+181);
            if not Snow then SetAllPalette(P3); {Prevent "holes"}
            SetAllPalette(P2); Delay(10);
            SetColor(2); Rectangle(n,n,n+180,n+180); 
        end;
        n:=20+1; SetColor(8); Rectangle(n,n,n+180,n+180);
    until keypressed;
    closegraph; 
end.

Christen Fihl
Links

Copyright-Bestimmungen: siehe Über diese Seite