4.13 Beispiel 5: Blick durch ein Mikroskop

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

Das Mikroskop-Programm soll beispielhaft zeigen, wie mehrere Objekte dasselbe Objekt als ancestor definieren können. Das Programm simuliert den Blick durch ein Mikroskop auf in Flüssigkeit schwimmende Mikroben. Damit die Wahrscheinlichkeit steigt, dass die Mikroben zu sehen sind, werden sie von der Bühnenmitte angezogen. Die Mikroben schwimmen auf verschiedenen Ebenen der Flüssigkeit. Mikroben der selben Ebene stoßen einander ab und umkreisen sich. Zur Darstellung der Ebenen erhalten die Mikroben unterschiedliche Werte für die Transparenz.

Die Definition der Ebenen und zugehörigen Mikroben findet beim Starten des Films statt.

global gEbenenListe

on startmovie
-- Ebenen mit Mikroben erzeugen
ebene1 = script("EbenenObjekt").new()
script("MikrobeObjekt").new(1, ebene1, 100)
script("MikrobeObjekt").new(2, ebene1, 100)
script("MikrobeObjekt").new(3, ebene1, 100)
ebene2 = script("EbenenObjekt").new()
script("MikrobeObjekt").new(4, ebene2, 75)
script("MikrobeObjekt").new(5, ebene2, 75)
script("MikrobeObjekt").new(6, ebene2, 75)
ebene3 = script("EbenenObjekt").new()
script("MikrobeObjekt").new(7, ebene3, 50)
script("MikrobeObjekt").new(8, ebene3, 50)
script("MikrobeObjekt").new(9, ebene3, 50)
ebene4 = script("EbenenObjekt").new()
script("MikrobeObjekt").new(10, ebene4, 25)
script("MikrobeObjekt").new(11, ebene4, 25)
script("MikrobeObjekt").new(12, ebene4, 25)
-- Ebenen der Ebenenliste hinzufügen
gEbenenListe = []
gEbenenListe.add(ebene1)
gEbenenListe.add(ebene2)
gEbenenListe.add(ebene3)
gEbenenListe.add(ebene4)
end startmovie

Die Ebene wird im Objekt MikrobeObjekt als ancestor definiert. Dadurch kann die Mikrobe erfragen, wo sich die anderen Mikroben derselben Ebene im Moment befinden und entsprechend ausweichen. Dies geschieht durch Aufruf der Methode andereVektoren() des ancestors.

property ancestor, mSprite, mBewegungsVektor, mMaxGeschwindigkeit
property mX, mY

on new me, spritenummer, ebenenObjekt, transparenz
-- erzeugt eine neue Mikrobe auf der angegebenen
-- Ebene mit der angegebenen Transparenz
mSprite = spritenummer
ancestor = ebenenObjekt
mX = random(2 * (the stage).rect.width) - me.mStageCenter.locH
mY = random(2 * (the stage).rect.height) - me.mStageCenter.locV
mBewegungsVektor = point(0.0, 0.0)
mMaxGeschwindigkeit = 5 + random(10)
sprite(mSprite).blend = transparenz
memberListe = [member(1), member(2), member(3)]
sprite(mSprite).member = memberListe[random(memberListe.count())]
me.anmelden(me)
return me
end new

on bewegen me
-- bewegt die Mikrobe
centerVektor = me.vektorNormalisieren(me.mStageCenter -
sprite(mSprite).loc)
neuerBewegungsvektor = mMaxGeschwindigkeit * me.vektorNormalisieren(
2*me.vektorNormalisieren(mBewegungsVektor)
+ centerVektor + 0.9*me.vektorNormalisieren(me.andereVektoren(me)))
mX = mX + neuerBewegungsvektor[1]
mY = mY + neuerBewegungsvektor[2]
sprite(mSprite).loc = point(mX, mY)
mBewegungsVektor = neuerBewegungsvektor
end bewegen

on getLoc me
-- gibt die Position der Mikrobe zurück
return point(mX,mY)
end getLoc

Da das Ebenenobjekt nicht weiß, von welchen Objekten es als ancestor definiert wird, müssen sich die Mikrobe auf der Ebene anmelden. Sie werden dann im Ebenenobjekt der mMikrobenObjekte-Liste hinzugefügt.

property mMikrobenObjekte, mStageCenter

on new me
-- erzeugt eine neue Ebene
mMikrobenObjekte = []
-- Bühnenmittelpunkt
mStageCenter = point((the stage).rect.width/2, (the stage).rect.height/2)
return me
end new

on anmelden me, objekt
-- meldet eine Mikrobe auf der Ebene an
mMikrobenObjekte.add(objekt)
end anmelden

on bewegen me
-- bewegt alle Mikroben der Ebene
repeat with mikrobe in mMikrobenObjekte
mikrobe.bewegen()
end repeat
end bewegen

on vektorNormalisieren me, vektor
-- normalisiert den angegebenen Vektor
vektorBetrag = sqrt(power(vektor[1],2) + power(vektor[2],2))
if vektorBetrag = 0 then
return vektor
else
return (vektor/vektorBetrag)
end if
end vektorNormalisieren

on andereVektoren me, aufrufer
-- gibt die Summe der Vektoren von aufrufer auf die anderen
-- Mikroben derselben Ebene zurück
vektor = point(0.0, 0.0)
repeat with mikrobe in mMikrobenObjekte
if mikrobe <> aufrufer then
vektor = vektor + me.vektorNormalisieren(aufrufer.getLoc() -
mikrobe.getLoc())
end if
end repeat
return vektor
end andereVektoren

Wie für die meisten Beispiele zur Vererbung in Lingo gilt auch für das Mikroskop-Beispiel, dass man es auch ohne Vererbung hätte umsetzen können. Letztendlich bleibt es dem Geschmack des Programmierer überlassen, für welche Umsetzung er sich entscheidet.

Quellcode des Beispiels

4.12 Beispiel 4: Warhol's Flowers 4.14 Beispiel 6: Dynamische Vererbung