MicroStudio und Python: Ein Partikelsystem
Da spülte doch dieses wunderschöne Video »Basics of Particle Systems« in meinen Feedreader, in dem Patt Vira in Anlehnung an Daniel Shiffmans wunderbarem Buch »The Nature of Code« ein Partikelsystem in P5.js programmiert. Und da fiel mir doch wieder ein, daß ich erst jüngst die Idee hatte, wenigstens Teile aus dem Buch auch mal in microStudio (in der Python/Brython-Variante) zu implementieren.
Dafür brauchte ich natürlich wieder meine Klasse PVector2
. Da sie sehr lang ist, verzichte ich auch dieses Mal auf einen erneuten Abdruck, Ihr könnt sie von dieser Seite kopieren und in Eure Projekte einfügen.
Ansonsten gibt es die Klasse Particle
, die die Grundlage für das Skript legt:
class Particle():
def __init__(self, _x, _y):
self.loc = PVector2(_x, _y)
self.acc = PVector2(0, 0.005)
self.vel = PVector2(uniform(-1.0, 1.0), uniform(-2.0, 0.0))
self.col = choice(colors)
self.lifespan = 255.0
self.d = uniform(3, 10)
self.done = False
def update(self):
self.vel += self.acc
self.loc += self.vel
self.lifespan -= uniform(0.5, 1.0)*3
if self.lifespan <= 10:
self.done = True
def display(self):
screen.setAlpha(self.lifespan/255)
screen.fillRound(self.loc.x, self.loc.y, self.d, self.d, self.col)
screen.drawRound(self.loc.x, self.loc.y, self.d, self.d, "rgb(33, 41, 70)")
screen.setAlpha(1.0)
Den meisten von Euch wird auffallen, daß diese Klasse kaum Besonderheiten der microStudio-API nutzt. Lediglich die Methode display()
macht naturgemäß davon Gebrauch.
Das gilt auch für das Hauptprogramm main
, in dem lediglich die draw()
-Funktion Befehle aus der microStudio-API benötigt. Alles andere ist Python pur:
from random import random, choice, uniform
colors = ["rgb(8, 247, 254)", "rgb(254, 83, 187)",
"rgb(245, 211, 0)", "rgb(0, 255, 65)",
"rgb(250, 25, 25)", "rgb(148, 103, 89)"]
START_X, START_Y = -50, 70
particles = []
def init():
pass
def update():
particle = Particle(START_X, START_Y)
particles.append(particle)
for particle in reversed(particles):
if particle.done:
particles.remove(particle)
for particle in particles:
particle.update()
def draw():
screen.clear()
# screen.fillRect(0, 0, screen.width, screen.height, "rgb(33, 41, 70)")
screen.drawSprite("background", 0, 0, screen.width, screen.height)
for particle in particles:
particle.display()
Um ein wenig Abwechslung in die Farben zu bringen, habe ich die kürzlich vorgestellte, neonbunte Palette MPL Cyberpunk benutzt. Und um die Angelegenheit ein wenig spielerischer zu gestalten, habe ich das Hintergrundbild, in dem ein Junge auf einem fernen Planeten das Partikelsystem bestaunt, von der gekünstelten Intelligenzia meines Vertrauens erstellen lassen (siehe unten).
Das ist das elfte Tutorial meiner »microStudio mit Python«-Reihe. Alle bisher im Schockwellenreiter erschienenen Beiträge habe ich hier aufgeführt, um Euch eine Suche zu ersparen:
- MicroStudio und Python (Teil 1): Hallo Brython!
- MicroStudio und Python (Teil 2): Zombie Apokalypse
- MicroStudio und Python (Teil 3): Dancing Crab
- MicroStudio und Python (Teil 4): Flying Badger
- MicroStudio und Python (Teil 5): PVector2 und »The Nature of Code«
- MicroStudio und Python (Teil 6): Bouncing Balls
- MicroStudio und Python (Teil 7): Kollisionserkennung mit Kreisen
- MicroStudio und Python (Teil 8): Bouncing Birds
- MicroStudio und Python (Teil 9): Kollisionserkennung mit Rechtecken
- MicroStudio und Python (Teil 10): Bubbly Emojis
- MicroStudio und Python (Teil 11): Ein Partikelsystem
Und natürlich habe ich dieses Programm auch wieder auf meinen microStudio-Account hochgeladen, damit Ihr es anschauen und damit weiter experimentieren könnt. Je länger ich damit Spiele, desto mehr Spaß habe ich mit der Python-Variante von microStudio (auch wenn ich hin und wieder über Beschränkungen der API stolpere). Habt also auch Spaß mit Eurer Version der bunten Kreise!
(Hintergrund-) Bild: Space Opera (Belgian Comic Style), erstellt mit Scenario. Prompt: »Full moon with a human face smiles at a nightly sky with stars and a few clouds. colored french comic style«. Modell: Stable Diffusion XL, Style: Scifi Magic + Belgian School.