Mein Experiment, die Programme aus Daniel Shiffmans überaus lesenswertem Buch »The Nature of Code« nach Pygame Zero zu portieren, geht weiter. Ich befinde mich da bekantlich ja in bester Gesellschaft, denn auch Shiffman arbeitet an einem Reboot seines Buches: Er portiert die Programme gerade nach P5.js, dem JavaScript-Mode von Processing. Seine Fortschritte kann man in dieser Playlist verfolgen.
Doch zurück zu meinen Experimenten: Damit der Mover der Maus folgen kann, mußte ich doch tatsächlich Pygame bemühen, Pygame Zero hat keine eigene Methode, um die Mausposition abzufragen. Aber es hat nicht wehgetan und funzt jetzt genau so, wie das Processing-Programm aus »The Nature of Code«, Seiten 57ff.
Um die Mausposition abfragen zu können, mußte ich – wie oben schon geschrieben – Pygame importieren. Mit diesen Zeilen bekam ich dann die Mauskoordinaten und konnte sie in einen Vektor umwandeln:
mouse_x, mouse_y = pygame.mouse.get_pos() mouse = PVector(mouse_x, mouse_y)
Für die Subtraktion zweier Vektoren habe ich in meiner PVector-Klasse keine statische Methode implementiert, sondern mit Operatoren-Überladung gearbeitet. Daher kann ich die Substraktion dieser beiden Vektoren ganz einfach mit
dir = mouse - self.location
durchführen. Operatoren-Überladung ist ein sehr mächtiges Mittel und funktioniert so nur dank Pythons Duck Typing.1 Das erkennt, daß rechts und links vom Minus-Operator je ein PVector
steht und wählt daher automatisch die Methode, die in der Klasse für die Subtraktion implementiert wurde.
Der Rest der update()
-Methode ist nahezu identisch mit dem Processing-Sketch in »The Nature of Code«, lediglich diese beiden abschließenden Zeilen habe ich zusätzlich implementiert:
self.pos = (self.location.x, self.location.y) self.angle += self.rotspeed
Die erste dieser beiden Zeilen ist der Tatsache geschuldet, daß die Actor
-Klasse von Pygame Zero die Position als Tupel verlangt und mit der letzten Zeile lasse ich – wie schon im ersten Teil dieser (kleinen?) Reihe – den Ball rotieren.
Für die Klasse Mover habe ich in diesem Skript nur die Methode bounce()
genutzt, denn es hatte mich doch irritiert, wenn der Ball auf der gegenüberliegenden Fensterseite wieder auftauchte. 🤓
Und nun zur Befriedigung Eurer Neugierde das komplette Programm:
import pygame import pgzrun from pvector import PVector import random WIDTH = 480 HEIGHT = 480 TITLE = "Mover 2" RADIUS = 16 class Mover(Actor): def __init__(self, x, y, im, rotspeed): super().__init__(im, (x, y)) self.pos = (x, y) self.im = im self.rotspeed = rotspeed self.angle = 90 self.location = PVector(x, y) self.velocity = PVector(0, 0) self.topspeed = 10 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 mover = Mover(100, 200, "ball1", 5) def draw(): screen.fill((100, 200, 0)) mover.draw() def update(): mover.update() mover.bounce() pgzrun.go()
Ihr findet es auch – inklusive der Assets – in meinem GitHub-Repositorium zu dieser Reihe. Das Programm heißt dort moverandmouse.py
. Wenn Ihr Pygame Zero ( Version 1.2) auf Eurem System installiert habt, braucht Ihr nur dieses Programm und den Ordner images
hochzuladen und dann könnt Ihr das Skript starten.
Jetzt fehlt mir nur noch das Skript mit den vielen Bällen, dann kann ich das erste Kapitel abschließen und Daniel Shiffman in das zweite Kapitel folgen. Still digging!
Wenn es watschelt wie eine Ente, schwimmt wie eine Ente und quakt wie eine Ente, dann ist es eine Ente. ↩
Ü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!