It’s done! Mit nur wenigen Änderungen im Quellcode ist das letzte Script aus »The Nature of Code«, Kapitel 1, von Processing nach Python, genauer Pygame Zero, portiert. Ich habe die Klasse Mover
für diesen Einsatz etwas abgespeckt, denn da ich sowohl die Anfangsposition wie auch den Rotationswinkel per Zufallszahlengenerator bestimmen lasse, muß ich sie nicht dem Konstruktor übergeben. Außerdem habe ich die Methode check_edges()
entfernt. Mir ist es lieber, wenn die Bälle vom Spielfeldrand abprallen, als wenn sie auf die gegenüberliegende Seite teleportiert werden.
Der Rest war nur noch ein wenig gewohnte Listenarithmetik. Mit
movers = [] for _ in range(NUMBERMOVERS): movers.append(Mover("ball1"))
habe ich die Liste movers[]
initialisiert und in den beiden Methoden update()
und draw()
die Python-spezifische Syntax for element in liste
angewandt:
def draw(): screen.fill((100, 200, 0)) for mover in movers: mover.draw() def update(): for mover in movers: mover.update() mover.bounce()
Hier wie immer das vollständige Programm (ich habe es manymovers.py
genannt), das Ihr mit allen Assets wie immer auch in meinem GitHub-Repositorium finden könnt.
import pygame import pgzrun from pvector import PVector from random import randint WIDTH = 480 HEIGHT = 480 TITLE = "Mover 3 (Der Tanz der Bälle)" RADIUS = 16 NUMBERMOVERS = 10 class Mover(Actor): def __init__(self, im): super().__init__(im) # self.pos = (x, y) self.im = im self.rotspeed = randint(-5, 5) self.angle = 90 self.location = PVector(randint(0, HEIGHT), randint(0, WIDTH)) self.velocity = PVector(0, 0) self.topspeed = randint(6, 12) def update(self): mouse_x, mouse_y = pygame.mouse.get_pos() mouse = PVector(mouse_x, mouse_y) dir = mouse - self.location dir.normalize() dir.mult(0.5) self.acceleration = dir self.velocity.add(self.acceleration) self.velocity.limit(self.topspeed) self.location.add(self.velocity) self.pos = (self.location.x, self.location.y) self.angle += self.rotspeed def bounce(self): if (self.location.x > WIDTH - RADIUS) or (self.location.x < RADIUS): self.velocity.x *= -1 if (self.location.y > HEIGHT - RADIUS) or (self.location.y < RADIUS): self.velocity.y *= -1 movers = [] for _ in range(NUMBERMOVERS): movers.append(Mover("ball1")) def draw(): screen.fill((100, 200, 0)) for mover in movers: mover.draw() def update(): for mover in movers: mover.update() mover.bounce() pgzrun.go()
Damit habe ich meinen Rückstand auf Daniel Shiffman verringert. Nun geht es auch bei mir mit dem zweiten Kapitel los. Ich freue mich darauf. Still digging!
Ü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!