Welcome to the new Friends-of-FPC!

Here you can find all kinds of information about the FreePascal Compiler. We have many tutorials and howtos as well as a selection of tools to help you with your programming. We also have some example codes for you. And if you want to contribute some information/ sources/ tools yourself you can do so.
Also we have finally relaunched the FoFPC forum. It's your chance for some Q&A about everything FreePascal.

Friends-of-FPC

Tutorials: Learn how to code with FreePascal.

Source Codes: A collection of examples, miscellaneous source codes and open source stuff.

Tools and Help Files: Intro- duction of some tools that might help you with FPC.

Community

Forum: Ask or answer questions about the FreePascal Compiler, programming or just babble about coding.

Contribute! Contribute your own Tutorial, Source Codes or Tools and send them to us!

Website

About: Information about Friends-of-FPC.org.

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

Useful Links









Link to us