4.12 Beispiel 4: Warhol's Flowers

<img src="../grafik/bilder/beispiel4.jpg" width="256" height="256" align="right" hspace="10"> In diesem Beispiel wollen wir eine Zeichenfläche programmieren, auf die per Mausklick Blumen im Stil Andy Warhols gezeichnet werden können. Wir beginnen mit einem einfachen Blumenprototypen, den wir per Vererbung soweit spezialisieren wollen, dass die Blume eine individuelle Farbe und Ausrichtung bekommen.

Der grobe Programmablauf sieht folgendermaßen aus:
Bei Programmstart wird das Objekt ZeichenflaecheObjekt erzeugt, das die Aufgabe hat, auf Anforderung neue Blumen zu generieren und in einer Liste zu speichern. Daraufhin wird in jedem Frame die zeichnen()-Methode der Blume aufgerufen. Verlässt der Cursor die Bühne, werden die Blumen wieder gelöscht. Als Argumente erhält der new-Handler des Objektes BlumePrototyp-Objekt die Spritenummer der Blume und deren Position auf der Bühne. Nach dem Erzeugen der Blume ruft das ZeichenflaecheObjekt die Methode startAnimation() der Blume auf. Bei jedem Aufruf der zeichnen()-Methode wird eine weitere Phase der Blumen-Animation angezeigt, bis die Blume geöffnet ist.


Die Phasen der Blumen-Animation

Hier ist das Skript für das BlumePrototyp-Objekt:

property mSpriteNummer, mPosition
property mMemberListe, mAnimationEin

on new me, spritenummer, position
mSpriteNummer = spritenummer
mPosition = position
mMemberListe = ["Blume01", "Blume02", "Blume03", "Blume04",
"Blume05", "Blume06", "Blume07", "Blume08", "Blume09", "Blume10"]
mAnimationEin = false
return me
end new

on zeichnen me
-- zeichnet die Blume
puppetsprite(mSpriteNummer, true)
sprite(mSpriteNummer).member = member(mMemberListe[1])
sprite(mSpriteNummer).loc = mPosition
if mAnimationEin then
if mMemberListe.count() > 1 then
mMemberListe.deleteAt(1)
else
mAnimationEin = false
end if
end if
end zeichnen

on startAnimation me
-- startet die Animation
mAnimationEin = true
end startAnimation

on loeschen me
-- löscht die Blume
puppetsprite(mSpriteNummer, false)
end loeschen

Die Positionierung und Animation der Blume funktioniert nun zwar, aber jede Blume zeigt sich in der identischen Ausrichtung und im gleichen Grau. Daher wollen wir als Spezialisierung des Blumen-Prototypen das BlumenObjekt einführen, das den Prototypen als ancestor definiert. Dies geschieht im new-Handler, neben der Initialisierung der Eigenschaften mFarbe und mRotation, für die aus vorgegebenen Werten einer zufällig ausgewählt wird. Die Methode zeichnen() delegiert zunächst den Aufruf an den ancestor, anschließend wird das Blumensprite eingefärbt und gedreht. Das Skript BlumenObjekt sieht folgendermaßen aus.

property ancestor
property mFarbe, mRotation

on new me, spritenummer, position
-- in welchem Sprite liegt die Blume?
ancestor = script("BlumePrototyp").new(spritenummer, position)
-- zufällig die Eigenschaften der Blume bestimmen
mFarbe = [rgb(173, 66, 57),rgb(189, 123, 132),
rgb(189, 100, 57)][random(3)]
mRotation = [0, 90, 180, 270][random(4)]
return me
end new

on zeichnen me
-- zeichnet die Blume
ancestor.zeichnen()
sprite(me.mSpriteNummer).color = mFarbe
sprite(me.mSpriteNummer).bgcolor = mFarbe
sprite(me.mSpriteNummer).rotation = mRotation
end zeichnen

Quellcode des Beispiels

4.11 Vererbung mit the ancestor 4.13 Beispiel 5: Blick durch ein Mikroskop