MicroStudio und Python: Ein Partikelsystem

microStudio
Python
Brython
Nature of Code
Creative Coding
Autor:in

Jörg Kantel

Veröffentlichungsdatum

27. April 2024

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:

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.