Spiele in Lazarus objektorientiert programmieren/Ein einfaches Spiel mit mehreren Objekten

Aus ZUM-Unterrichten

Herunterladen von Bildern

Auf die Dauer ist ein einfaches Fenster, auf dem außer dem Hinweis nichts zu sehen ist, doch recht langweilig. Deshalb wollen wir nun auf diesem Fenster weitere Objekte platzieren, in diesem Fall: Bilder.

In vielen Computerspiele darf sich der Held an irgendwelche Gegenstände (magische Objekte, Werkzeuge, Waffen, ...) oder Charaktere/Rollen heraussuchen. So etwas soll hier programmiert werden. Dafür brauchen wir natürlich Bilder. Am besten eigenen sich für unsere Zwecke Bilder, die im Format .png gespeichert sind. Solche Bilder findet man in sehr großen Mengen und zu einer riesigen Anzahl von Themen legal auf der Seite http://www.openclipart.org; noch toller sind natürlich selbst gezeichnete Bilder aber nicht jeder von uns ist ein großer Künstler.

Für unser Spiel könnten wir z.B. brauchen:

  • ein Schwert
  • ein Buch
  • ein magisches Kraut

Lade Dir entsprechende Bilder im PNG-Format herunter.

Achtung
SVG-Bilder können von Lazarus nicht angezeigt werden. Eine geringe Auflösung des PNG-Bildes (kleines Bild) reicht vollkommen aus.



Einbinden der Bilder in das eigene Programmierprojekt

Zunächst erstellen wir ein neues Projekt und speichern es im Ordner ErstesSpiel (kein Leerzeichen). Dabei heißt das Projekt ebenfalls ErstesSpiel, während wir das Fenster ErstesSpiel_fm nennen (wieder kein Leerzeichen).


Um ein Bild auf dem Fenster zu platzieren, wählt man im Lazarus-IDE-Fenster die Registerkarte Additional und wählt dort ein Objekt des Typs TImage durch Anklicken aus. Danach kann man auf dem Fenster das Bild mit der Maus in die gewünschte Größe ziehen (Größe und Ort kann man aber auch noch nachträglich ändern). Die Information, welches Bild nun tatsächlich angezeigt werden soll, steht in der Eigenschaft Picture im Objektinspektor. Neben dieser Eigenschaft steht ein Knopf mit drei Punkten ("..."). Drückt man diesen mit der Maus, so öffnet sich der "Bild-Laden-Dialog". Hier kann man eines der zuvor heruntergeladenen Bilder auswählen. Es kann sein, dass das Bild zu groß oder zu klein für die Darstellung ist. Dieses Problem lässt sich aber leicht lösen, indem man die Eigenschaft Stretch im Objektinspektor auf True setzt.

Angenommen, wir haben Bilder zu den drei oben genannten Spielgegenständen heruntergeladen. Dann erzeugen wir jetzt insgesamt 6 Image-Objekte, von denen jeweils zwei den gleichen Gegenstand zeigen (wie in der Graphik links).

BILD

Für die drei unteren Bilder setzen wird im Objektinspektor die Eigenschaft Visible auf False, so dass beim Start des Programms diese drei Bilder nicht zu sehen sind (wie bei der Graphik rechts). Bei jetzt immerhin schon 6 Image-Objekten lohnt es sich, die Übersichtlichkeit dadurch zu vergrößern, dass man den Objekten statt Image1 bis Image6 sprechende Namen gibt (Eigenschaft Name im Objektinspektor). Wir verwenden hier imSchwertOben, imSchwertUnten, imBuchOben, imBuchUnten, imimKrautOben und imKrautUnten, wobei die "Vorsilbe" im... uns daran erinnern soll, dass es sich um Images handelt.



Wichtig: Da wir es hier jetzt mit mehreren Objekten zu tun haben, müssen wir im Objektinspektor zunächst tatsächlich Form1 auswählen und dann im Reiter „Ereignisse“ rechts neben dem Ereignis OnMouseDown einen Doppelklick ausführen.

In der zweiten Zeile kann man erkennen, dass innerhalb der Methode noch die Variablen X und Y zur Verfügung stehen. Diese liefern die Informationen, wo genau der Mauszeiger stand, als die Maustaste gedrückt wurde. Das lässt sich nutzen, um unsere geometrische Form mit der linken oberen Ecke genau an die Position des Mauszeigers zu setzen, wenn die Maustaste gedrückt ist. Will man, dass das geometrische Objekt z.B. unsichtbar wird, wenn man auf das geometrische Objekt selbst klickt, so muss man im Objekt Shape1 im Objektinspektor auswählen und dann dort neben dem Ereignis OnMouseDown den Doppelklick ausführen.

Die so entstandene Methode können wir nun ergänzen.

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Shape1.Visible:=FALSE;
end;

Wichtig: Egal, welches Objekt (hier: Fenster oder geometrisches Objekt) das Ereignis auslöst; die zugehörige Methode gehört in Lazarus immer zum Fenster.