image image


image

Tutorial: Bouncing Ball mit Pygame Zero und PVector

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!

image

  1. 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. 


(Kommentieren) 

image image



Ü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!


Werbung


image  image  image
image  image  image


image