|

Grundlagen der Grafikprogrammierung - Teil 15 - by Delax
Shita!
In diesem Teil kommen wir zu Sprites. Sprites sind rechteckige Bilder, die auf dem Bildschirm dargestellt und bewegt werden können. Wetten darauf habt ihr schon lange gewartet?
Bevor ihr jedoch auf so Dinge wie Bitmaps oder ähnliches kommt, zuerst wollen wir uns nur mit Abbildern in Arrays beschäftigen.
Um mit Sprites vernünftig arbeiten zu können benötigen wir eine Struktur, die unser Sprite enthält. Dafür nutzen wir einen Record, in dem wir alle wichtigen Variablen unterbringen. Einen Record könnt ihr euch als Sammlung von Variablen vorstellen, die alle unter einer Gruppe (eben dem Record) zusammen gefasst werden.
Machen wir uns erst einmal Gedanken, was unser Spritesystem so alles benötigt. Als erstes natürlich die X und Y Position auf dem Bildschirm. Dann brauchen wir noch ein MaxX und ein MaxY des Abbildes, um zu wissen wie hoch/ breit es ist. Fürs erste wars das. Alles andere kommt später.
Wie definiert man nun einen Record? Das ist ganz simpel - schau mal her:
TYPE spritesystem = record
PositionX, PositionY : longint;
MaxX, MaxY : longint;
end;
Erst definiert man einen Type und eben jener Type ist ein Record mit Namen spritesystem. Dann kann man die Variablen angeben, die in dem Record enthalten sein sollen. Will man nun eine Struktur von Typ spritesystem nutzen muß man sie zuerst definieren:
Sprite : spritesystem;
Jetzt kann man mit "Sprite.PositionX" z.B. auf die Variable innerhalb der Struktur zugreifen. Einfach und übersichtlich, oder? Doch zurück zu unseren Sprites...
Wie gesagt nutzen wir erst einmal die einfachste Form eines Sprites: ein in einem Array abgelegtes Abbild. Im Prinzip funktioniert es aber mit einer externen Grafikdatei genauso. Ihr habt also eure Array:
CONST SpriteArray : array[0..19,0..19]of byte=
((0,0,0,0,0,0,0,0,9,9,9,9,9,0,0,0,0,0,0,0),
(0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0),
(0,0,0,0,9,9,0,0,0,9,9,0,0,0,9,9,0,0,0,0),
(0,0,0,9,9,0,0,0,0,9,9,0,0,0,0,9,9,0,0,0),
(0,0,0,9,9,0,0,0,0,9,9,0,0,0,0,9,9,0,0,0),
(0,0,9,9,0,0,0,0,0,9,9,0,0,0,0,0,9,9,0,0),
(0,0,9,9,0,0,0,0,0,9,9,0,0,0,0,0,9,9,0,0),
(0,9,9,0,0,0,0,0,0,9,9,0,0,0,0,0,0,9,9,0),
(0,9,9,0,0,0,0,0,0,9,9,0,0,0,0,0,0,9,9,0),
(0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0),
(0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0),
(0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0),
(0,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,0),
(0,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,0),
(0,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,0),
(0,0,9,9,9,0,0,0,0,0,0,0,0,0,0,9,9,9,0,0),
(0,0,0,9,9,9,0,0,0,0,0,0,0,0,0,9,9,9,0,0),
(0,0,0,0,9,9,9,9,0,0,0,0,9,9,9,9,9,0,0,0),
(0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0),
(0,0,0,0,0,0,0,9,9,9,9,9,9,0,0,0,0,0,0,0));
Was das nun soll? Technisch gesagt ist das ein zweidimensionaler Array mit Neunen und Einsen als Inhalt. Aber was noch? Als Sprite betrachtet ist es nichts anderes als ein Bild. Und der Inhalt sind die Farbwerte. Man muß also nichts weiter tun als von 0 bis MaxX-1 und 0 bis MaxY-1 die PutPixel-Prozedur aufrufen. Simpel genug?
FOR counter2 := 0 TO Sprite.MaxY-1 DO
FOR counter1 := 0 TO Sprite.MaxX-1 DO
PutPixel(vidvscr,
Sprite.PositionX+counter1,
Sprite.PositionY+counter2,
SpriteArray[counter1,counter2],1);
Und ich verrate euch noch etwas schönes. Stellt euch vor, ihr wollt eine Farbe (beispielsweise den Hintergrund) transparent machen, dann müsst ihr einfach nur eine IF Abfrage durchführen und wenn die transparente Farbe gezeichnet werden soll wird der Aufruf nicht abgesetzt.
FOR counter2 := 0 TO Sprite.MaxY-1 DO
FOR counter1 := 0 TO Sprite.MaxX-1 DO
IF SpriteArray[counter2,counter1] <> 0 THEN
PutPixel(vidvscr,
Sprite.PositionX+counter1,
Sprite.PositionY+counter2,
SpriteArray[counter2,counter1],1);
Das ist es auch schon. Na gut, ich gebe zu, das ist ein sehr simples Spritesystem. Den Array würde man Beispielsweise eher in einen Pointer packen und anstatt den Umweg über PutPixel zu gehen würde man den Pointer direkt in vidvscr kopieren. Ihr könnt das ja mal alleine probieren, ansonsten kommt es irgendwann dran. Spätestens wenn wir
lernen Grafiken einzuladen.
Den kompletten Codes des Beispiels könnt ihr hier downloaden. Bis zum nächsten Mal!
Delax/ Sundancer Inc.
[delax@sundancerinc.de]
Back to previous page
|