image image


The Nature of Code, Kapitel 1 (Teil 3): Viele Bälle folgen der Maus

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.

image

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!

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