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
![]() |
|||
![]() |
4.11 Vererbung mit the ancestor | 4.13 Beispiel 5: Blick durch ein Mikroskop | ![]() |