Abschließend will ich ein Beispiel für die dynamische Vererbung, also den Wechsel des ancestors im laufenden Programm, darstellen. Das Objekt KollisionsObjekt bewegt ein Objekt über die Bühne. Wenn das Objekt den Rand der Bühne berührt, prallt es daran ab.
-- dieses Objekt bewegt sich über die Bühne; wenn
es
-- an eine Kante stößt, prallt es von ihr ab
-- die grafische Darstellung wird vom ancestor übernommen;
-- er muss folgende Methoden implementieren:
--
-- draw()
-- zeichnet die Grafik mit Hilfe Sprite Spritenummer an
-- die Position (x|y)
-- getWidth()
-- getHeight()
-- liefert Breite und Höhe der Grafik; es wird davon ausgegangen,
-- dass der Registrierungspunkt in der Mitte der Grafik liegt
property ancestor, mBewegungsvektor, mX, mY
on new me, vektor, x, y
-- der aktuell Bewegungsvektor (dx|dy)
mBewegungsvektor= vektor
-- die Position des Objekts
mX = x
mY = y
return me
end new
on getX me
-- gibt die horizontale Position zurück
return mX
end getX
on getY me
-- gibt die vertikale Position zurück
return mY
end getY
on setAncestor me, objekt
-- setzt den ancestor
ancestor = objekt
end setAncestor
on bewegen me
-- bewegt das Objekt ein Stück weiter
mX = mX + mBewegungsvektor.locH
mY = mY + mBewegungsvektor.locV
-- minimal und maximal zulässige x- und y-Werte ausrechnen
xMin = me.getWidth()/2
yMin = me.getHeight()/2
xMax = (the stage).rect.width - me.getWidth()/2
yMax = (the stage).rect.height - me.getHeight()/2
-- prüfen, ob Objekt zu weit links ist
if mX < xMin then
-- Objekt links abprallen lassen
mX = xMin + xMin - mX
-- Bewegunsrichtung umkehren
mBewegungsvektor = mBewegungsvektor * point(-1, 1)
else
-- prüfen, ob Objekt zu weit rechts ist
if mX > xMax then
-- Objekt rechts abprallen lassen
mX = xMax + xMax - mX
-- Bewegunsrichtung umkehren
mBewegungsvektor = mBewegungsvektor * point(-1, 1)
end if
end if
-- prüfen, ob Objekt zu weit oben ist
if mY < yMin then
-- Objekt oben abprallen lassen
mY = yMin + yMin - mY
-- Bewegunsrichtung umkehren
mBewegungsvektor = mBewegungsvektor * point(1, -1)
else
-- prüfen, ob Objekt zu weit unten ist
if mY > yMax then
-- Objekt unten abprallen lassen
mY = yMax + yMax - mY
-- Bewegunsrichtung umkehren
mBewegungsvektor = mBewegungsvektor * point(1, -1)
end if
end if
end bewege
In jedem Frame werden die Methoden bewegen() und draw() des Objektes ausgeführt.
global gBewegungsObjekt
on exitFrame
-- Objekt bewegen
gBewegungsObjekt.bewegen()
-- Objekt zeichnen
gBewegungsObjekt.draw()
go to the frame
end exitFrame
Dabei muss die Methode draw() vom ancestor definiert werden, ebenso wie die Methoden getHeight() und getWidth(), die das KolissionsObjekt benötigt, um zu bestimmen, wann das bewegte Objekt den Bühnenrand berührt. Die einfachste Implementierung ist die des KreisObjekts, das einfach eine Grafik über den Bildschirm schiebt.
-- einfaches Objekt, das einen Kreis zeichnet und sich dabei
-- der Koordinaten eines Unterobjektes bedient (mit getX, getY)
property mSprite, mGrafikMember
on new me, s
-- in welchem Sprite liegt die Grafik?
mSprite = sprite(s)
-- welche Grafik wird angezeigt?
mGrafikMember = member("Kreis")
return me
end new
on draw me
mSprite.member = mGrafikMember
mSprite.loc = point(me.getX(), me.getY())
mSprite.width = mGrafikMember.width
mSprite.height = mGrafikMember.height
mSprite.rotation = 0
end draw
on getWidth me
-- Breite der Grafik
return mGrafikMember.width
end getWidth
on getHeight me
-- Höhe der Grafik
return mGrafikMember.height
end getHeight
Über die Buttons am unteren Rand des Bildschirms lässt sich der ancestor des Kollisionsobjekt im laufenden Programm zu einem pulsierenden Rechteck (PulsObjekt) oder einer sich drehenden Scheibe(RotationObjekt) wechseln. In diesen Objekten werden lediglich die drei Methoden draw(), getWidth() und getHeight() anders definiert. Das KollisionsObjekt bleibt dasselbe.
![]() |
|||
![]() |
4.13 Beispiel 5: Blick durch ein Mikroskop | 4.15 Synchronisation mit dem Drehbuch durch on stepframe und the actorlist | ![]() |