Nach einigen ausufernden Experimenten bin ich mit meinem Vorhaben, Daniel Shiffmans »The Nature of Code« nach Python zu portieren, ein gutes Stück vorangekommen. Wie berichtet, hatte ich mich, nachdem mich John Zelles Bibliothek Graphics.py doch etwas enttäuscht hatte,1 auf Pygame Zero versteift. Hier gab es zwar das Problem, das die Darstellung graphischer Primitive mehr als gewöhnungsbedürftig ist, aber da es eine hochspezialisierte Spiele-Umgebung (mit einem Fokus auf Anfänger) ist, kann man diese leicht durch Bilder ersetzen. Das habe ich in meinem abschließenden Beispiel ausprobiert.
Im Grunde genommen ist es ganz einfach: Statt sich mit Kreisen, Rechtecken oder sonstigen geometrischen Figuren herumzuquälen, nimmt man einfach Bilder. In meinem Fall habe ich – da das Programm ja nicht umsonst »Bouncing Balls« heißt – zwei Bälle aus dem riesigen Fundus der freien (CC-BY-4.0) Twemojis von Twitter entnommen und sie auf 32x32 Pixel heruntergerechnet. Daraus habe ich dann in Pygame Zero zwei Actor
gemacht und diese dann in die Simulation entlassen. Hier der vollständige Quellcode:
import pgzrun from pvector import PVector WIDTH = 400 HEIGHT = 400 TITLE = "Bouncing Ball 2" RADIUS = 16 ball1 = Actor("ball1") ball1.pos = (100, 200) ball1.position = PVector(100, 200) ball1.velocity = PVector(1.3, 5.0) ball2 = Actor("ball2") ball2.pos = (250, 100) ball2.position = PVector(250, 100) ball2.velocity = PVector(1.7, 3.5) def move(ball, rotspeed): ball.position.add(ball.velocity) ball.pos = (ball.position.x, ball.position.y) ball.angle += rotspeed if (ball.position.x > WIDTH - RADIUS) or (ball.position.x < RADIUS): ball.velocity.x *= -1 if (ball.position.y > HEIGHT - RADIUS) or (ball.position.y < RADIUS): ball.velocity.y *= -1 def draw(): screen.fill((100, 200, 0)) ball1.draw() ball2.draw() def update(): move(ball1, 3) move(ball2, -2) pgzrun.go()
Das Einzige, was ein wenig unschön ist, daß die Actor
-Klasse die Position der Bildchen (Actor.pos
) als ein Tupel verlangt und mit meinem wunderschönen PVector
nichts anfangen kann. Daher erfolgt die Initialisierung quasei doppelt:
ball1 = Actor("ball1") ball1.pos = (100, 200) ball1.position = PVector(100, 200)
Wäre ich Shiffman gefolgt und hätte den Vektor location
genannt, wäre das vermutlich niemandem aufgefallen. 🤓
Als besonderes Schmankerl habe ich den Bällen mit ball.angle += rotspeed
noch eine kleine Rotation um die eigene Achse verpaßt. Diese bekommt man in Pygem Zero fast geschenkt.
Wie dem auch sei, mit diesem Ergebnis meiner Versuche kann ich erst einmal leben und ich halte es für eine gute Ausgangsposition, um mit »The Nature of Code« auch außerhalb der Processing-Welt zu experimentieren. Still digging!
Damit wir uns nicht falsch verstehen, Graphics.py ist – für ihre Zwecke – keine schlechte Bibliothek, nur für Interaktionen mit dem Nutzer ist sie nicht gerüstet. ↩
Über …
Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!
Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.
Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.
Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes
von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.
Werbung
Diese Spalte wurde absichtlich leergelassen!