image image


The Nature of Code, Kapitel 1 (Teil 2): Folge der Maus

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.

image

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!

  1. Wenn es watschelt wie eine Ente, schwimmt wie eine Ente und quakt wie eine Ente, dann ist es eine Ente. 


(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