image image


image

Worknote: Die Klasse PVector in Pygame Zero (1)

Bei meinen Versuchen, Daniel Shiffmans »The Nature of Code« nach Python zu portieren, bin ich erst einmal von Graphics.py zu Pygame Zero gewechselt, nachdem mich die ersten Versuche mit John Zelles Bibliothek nicht zufriedengestellt hatten. Fühlt sich irgendwie besser an und zeigt, da keinen Boilerplate-Overhead, die Algorithmen mehr oder weniger pur. Allerdings ist die Qualität der Darstellung graphischer Primitive (Kreis, Rechteck, Linie etc.) etwas gewöhnungsbedürftig. Ich glaube, ich werde in einem nächsten Schritt auf Bilder (vermutlich von Twitters Twemojis »ausgeborgt«) ausweichen.

Ansonsten – für Neugierige – das Progrämmchen, soweit ich es an einem dusseligen Sonnabend-Nachmittag hingerotzt habe. Da sich Pygame Zero bei der objektorientierten Programmierung irgendwie ziert, mußte ich natürlich gegensteuern und die Bällchen erst einmal in eine Klasse auslagern. Das ist die Datei ball.py:

from pvector import PVector

WIDTH = 400
HEIGHT = 400

class Ball():
    
    def __init__(self, x, y, v_x, v_y, radius, color):
        self.position = PVector(x, y)
        self.radius = radius
        self.color = color
        self. velocity = PVector(v_x, v_y)
    
    def show(self, screen):
        screen.draw.filled_circle((self.position.x, self.position.y), self.radius, self.color)
    
    def move(self):
        self.position.add(self.velocity)
    
        if (self.position.x > WIDTH - self.radius) or (self.position.x < self.radius):
            self.velocity.x *= -1
        if (self.position.y > HEIGHT - self.radius) or (self.position.y < self.radius):
            self.velocity.y *= -1

Wie üblich, ist nahezu die vollständige Logik des Algorithmus’ in der Klasse implementiert worden (daher wird auch die Klasse PVector) nur hier benötigt. So schrumpft das Hauptprogramm auf wenige Zeilen Code zusammen:

import pgzrun
from ball import Ball

WIDTH = 400
HEIGHT = 400
TITLE = "Bouncing Ball"


ball1 = Ball(200, 150, 1.0, 3.3, 16, "red")
ball2 = Ball(100, 100, 1.5, 5.0, 16, "blue")

def draw():
    screen.fill("yellow")
    ball1.show(screen)
    ball2.show(screen)

def update():
    ball1.move()
    ball2.move()

pgzrun.go()

Als nächstes werde ich das alles noch ein wenig aufhübschen und mich danach wieder in Shiffmans Werk vertiefen. Ist nämlich für mich genau die richtige Beschäftigung, um mich von Corona und anderem abzulenken. Still digging!

image


(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