4.5 Beispiel 1: Zini

Die Einführung in die Grundkonzepte der Parent-Child-Programmierung soll mit einem einfachen Beispiel zum Thema Instanzen und Eigenschaften enden. Sicher erinnert sich noch der eine oder andere an das erste virtuelle Wesen im deutschen Kinderprogramm, den leuchtenden Wurm Zini. Zini lässt sich sehr elegant mit einem Lingo-Objekt nachprogrammieren.

<img src="../grafik/bilder/beispiel1.jpg" width="320" height="240">
Zini, der Computerwurm

Zini besteht aus lauter Scheiben, die sich nur dadurch unterscheiden, dass ihre Transparenz zunimmt, je weiter sie vom Kopf entfernt sind. Dadurch entsteht ein Nachleuchteffekt. Die Richtung des Wurm wird vom Kopf angegeben, alle Glieder folgen mit einer gewissen Verzögerung.

Da sich alle Segmente gleich verhalten, lassen sie sich durch das übergeordnete Skript WurmObjekt beschreiben:

-- Objekt für die Glieder des Wurms

property mSprite, mNachfolger

on new me, spriteNummer, transparenz
-- spriteNummer ist die Nummer des Spritekanals
mSprite = spriteNummer
mNachfolger = VOID -- das nächste Glied
sprite(mSprite).blend = transparenz
return me
end new

on bewegen me, punkt
-- Nachfolger dorthin bewegen, wo Glied jetzt ist
if objectP(mNachfolger) then
mNachfolger.bewegen(sprite(mSprite).loc)
end if
sprite(mSprite).loc = punkt
end bewegen

on hinzufuegen me, neuesGlied
-- fügt ein weiteres Glied hinzu; hat das Glied schon einen Nachfolger,
-- wird das Glied dem Nachfolger angefügt
if objectP(mNachfolger) then
mNachfolger.hinzufuegen(neuesGlied)
else
set mNachfolger = neuesGlied
end if
end hinzufuegen

Als Eigenschaften werden mSprite, dass die Nummer des verwendeten Sprites für dieses Segment enthält, und mNachfolger definiert. mNachfolger speichert das nachfolgende Segment des Wurms, bzw. VOID, falls dieses Segment das letzte Wurmsegment ist.

Dem new-Handler werden die Nummer des verwendeten Sprites und die Transparenz des Segmentes übergeben. Die Transparenz des Sprites wird gleich gesetzt und muss deswegen nicht gespeichert werden. Der Nachfolger wird erst später festgelegt und deswegen erst einmal auf VOID, also undefiniert, gesetzt.

In der bewegen()-Methode wird die Position des Sprites auf einen gegebenen Wert gesetzt. Bevor dies geschieht, wird aber noch die bewegen()-Methode des Nachfolgers aufgerufen, um diesen dorthin zu bewegen, wo das aktuelle Segment jetzt ist. Beachten Sie, dass dieser wiederum seinen Nachfolger aufruft, sofern er einen hat, usw.

Die Methode hinzufuegen() legt fest, welches Objekt das Nachfolger-Objekt ist. Damit nur die Referenz auf das erste Segment gespeichert werden muss, wird zuerst geprüft, ob schon ein Nachfolger existiert. Existiert ein Nachfolger, wird versucht, das neue Segment an den Nachfolger anzuhängen. Hat dieser schon einen Nachfolger, wird wieder versucht, das neue Segment weiterzugeben, bis ein Segment gefunden wird, das noch keinen Nachfolger hat. Das neue Segment wird dann dessen Eigenschaft mNachfolger zugewiesen.

Das Filmskript, das die Objekte erzeugt, sieht folgendermaßen aus:

global gWurmObj

on startmovie
-- Cursor unsichtbar machen
cursor 200
-- Wurm-Objekt initialisieren
gWurmObj = script("WurmObjekt").new(12, 100)
-- Hinzufügen von mehr Elementen
gWurmObj.hinzufuegen(script("WurmObjekt").new(11, 92))
gWurmObj.hinzufuegen(script("WurmObjekt").new(10, 84))
gWurmObj.hinzufuegen(script("WurmObjekt").new(9, 76))
gWurmObj.hinzufuegen(script("WurmObjekt").new(8, 68))
gWurmObj.hinzufuegen(script("WurmObjekt").new(7, 60))
gWurmObj.hinzufuegen(script("WurmObjekt").new(6, 52))
gWurmObj.hinzufuegen(script("WurmObjekt").new(5, 44))
gWurmObj.hinzufuegen(script("WurmObjekt").new(4, 36))
gWurmObj.hinzufuegen(script("WurmObjekt").new(3, 28))
gWurmObj.hinzufuegen(script("WurmObjekt").new(2, 20))
gWurmObj.hinzufuegen(script("WurmObjekt").new(1, 12))
end startmovie

Der Kopf des Wurmes wird in der Globalen gWurmObj gespeichert. Die neuen Segmente werden erzeugt und dem Kopf direkt hinzugefügt. Die Segmente mit ihrer Spritnummer und Transparenz könnte man auch in einer repeat-Schleife erzeugen; darauf wurde hier aber der Klarheit wegen verzichtet.

Das dritte Skript ist das Frameskript, das in jedem neuen Frame die Animation der Maus nachführt.

global gWurmObj

on exitFrame
gWurmObj.bewegen(the mouseLoc)
go to the frame
end exitFrame

Quellcode des Beispiels

4.4 Definieren von Eigenschaften 4.6 Analogien und Unterschiede zwischen Listen und Skript-Objekten