4.14 Beispiel 6: Dynamische Vererbung

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.

<img src="../grafik/bilder/beispiel6.jpg" width="320" height="240">

Quellcode des Beispiels

4.13 Beispiel 5: Blick durch ein Mikroskop 4.15 Synchronisation mit dem Drehbuch durch on stepframe und the actorlist