DU LERNST HIER... |
dass die objektorientierte Programmierung (OOP) ein Programmierkonzept ist, das in vielen Fällen hervorragend geeignet ist, um die reale Welt als Software zu modellieren. So wie du beispielsweise eine lebende Schildkröte als ein bestimmtes Lebewesen einer Tierklasse auffasst, ist eine Turtle in der Turtlegrafik ein bestimmtes Objekt der Softwareklasse Turtle. |
TURTLE-OBJEKTE |
Damit die Turtle ein Zuhause hat, erzeugst du zuerst ein Objekt der Klasse TurtleFrame mit dem Namen tf. Dazu rufst du die Funktion TurtleFrame() auf, die gleich heisst wie die Klasse selbst. Dabei erscheint auf dem Bildschirm ein Turtlefenster. tf = TurtleFrame() Man nennt diese Funktion den Konstruktor der Klasse TurtleFrame. Analog erzeugst du mit dem Konstruktor der Klasse Turtle ein Turtleobjekt tia, verwendest aber tf als Parameter, damit tia ins Turtlefenster gesetzt wird. tia = Turtle(tf) Ganz wie in der realen Welt besitzt ein Softwareobjekt bestimmte Eigenschaften und Fähigkeiten. Beispielsweise ein Turtleobjekt:
Mit dem Namen des Objekts kannst du auf die Eigenschaften und Fähigkeiten des Objekts zugreifen, indem du den Punktoperator verwendest. Um beispielsweise tia vorwärts laufen zu lassen, rufst du die Funktion tia.forward(100) auf. Statt Funktion sagt man bei Objekten auch oft Methode. Für das Turtleobjekt stehen dir alle Methoden zur Verfügung, die du bereits aus der Turtlegrafik kennst. |
MUSTERBEISPIELE |
from gturtle import * tf = TurtleFrame() tia = Turtle(tf, "green") tia.setPenColor("green") joe = Turtle(tf, "red") joe.setPenColor("red") s = 200 while s > 5: tia.forward(s) joe.forward(s) tia.left(90) joe.right(90) s -= 10
from gturtle import * def onMouseHit(x, y): t = Turtle(tf) t.setPos(x, y) star(t) def star(t): t.startPath() repeat 4: t.forward(100) t.left(144) t.fillPath() tf = TurtleFrame(mouseHit = onMouseHit) |
ANIMATIONEN MIT MEHREREN AKTOREN |
Brauchst du für eine Animation mehrere Aktoren, so kannst du mehrere Turtleobjekte erzeugen und jedem davon ein eigenes Animationsbild zuordnen. Du bewegst im folgenden Programm das rosa Pony von rechts nach links und das blaue Pony gleichzeitig von links nach rechts. Damit das blaue Pony in der richtigen Lage erscheint, musst du sein Bild vertikal spiegeln. Das machst du mit zwei zusätzlichen booleschen Parametern in drawImage(), die man wie folgt verwenden kann:
from gturtle import * tf = TurtleFrame() tia = Turtle(tf) tia.ht() tia.setPos(250, 0) tia.left(90) tia.wrap() img_tia = [0] * 8 for i in range(8): img_tia[i] = "sprites/pony_" + str(i) + ".gif" joe = Turtle(tf) joe.ht() joe.setPos(-250, 0) joe.right(90) joe.wrap() img_joe = [0] * 8 for i in range(8): img_joe[i] = "sprites/pony2_" + str(i) + ".gif" tf.enableRepaint(False) repeat: for i in range(8): tia.drawImage(img_tia[i]) joe.drawImage(img_joe[i], False, True) tf.repaint() tf.delay(100) tf.clear() tia.forward(5) joe.forward(5) |
MERKE DIR... |
Klassen fassen in der objektorientierten Programmierung (OOP) Eigenschaften und Fähigkeiten zusammen. Ein Objekt wird durch Aufruf des Konstruktors erzeugt, der den gleichen Namen wie die Klasse, aber eine Parameterklammer hat. Der Rückgabewert des Konstruktors wird einer Variablen zugewiesen, mit der man mittels des Punktoperators auf das Objekt zugreifen kann. |
ZUM SELBST LÖSEN |
|
Man kann die beiden Turtle parallel laufen lassen, wenn man für jede einen Thread erzeugt, in dessen run-Methode die Spirale gezeichnet wird.
from gturtle import * import thread def run(t, clockwise): s = 200 while s > 5: t.forward(s) if clockwise: t.right(90) else: t.left(90) s -= 10 tf = TurtleFrame() tia = Turtle(tf, "green") tia.setPenColor("green") joe = Turtle(tf, "red") joe.setPenColor("red") thread.start_new_thread(run, (tia, False)) thread.start_new_thread(run, (joe, True))
Noch eleganter ist es, die Klasse Turtle so zu erweitern, dass ein Objekt die weitere Fähigkeit erhält, einen Stern zu zeichnen. Man definiert dazu eine abgeleitete Klasse StarTurtle, die alle Eigenschaften und Fähigkeiten der Klasse Turtle erbt, aber noch die zusätzliche Methode star() enthält.
from gturtle import * class StarTurtle(Turtle): def __init__(self, tf, x, y): Turtle.__init__(self, tf) self.setPos(x, y) def star(self): self.startPath() repeat 4: self.forward(100) self.left(144) self.fillPath() def onMouseHit(x, y): t = StarTurtle(tf, x, y) t.star() tf = TurtleFrame(mouseHit = onMouseHit)