MicroStudio und Python: Ein Partikelsystem (Part 2)

microStudio
Python
Brython
Nature of Code
Creative Coding
Autor:in

Jörg Kantel

Veröffentlichungsdatum

28. April 2024

Meinen Beitrag von gestern über ein Partikelsystem mit microStudio und Python/Brython wollte ich noch ein wenig aufmotzen. Die Partikel sollten nicht nur einfach durch den Raum schweben, sondern dabei auch noch rotieren. Da man Kreisen aber eine Rotation schwer ansehen kann, habe ich dem System auch noch rechteckige (genauer quadratische) Partikel spendiert, die fröhlich drehend durch das Weltall schweben, bis sie – wie die Kreise – verblassen.

Dafür waren eigentlich nur wenige Änderungen im Code notwendig. Die größte Schwierigkeit war, die richtige Funktion in der microStudio-API für die Rotation einzelner Shapes (und Sprites) zu finden. Nachdem ich endlich den Unterschied zwischen screen.setRotation() (dreht den kompletten Bildschirm) und screen.drawRotation() (dreht einzelne Shapes und Sprites) begriffen hatte, war die Klasse RectParticle, die eine Unterklasse von Particle ist, schnell implementiert:

class RectParticle(Particle):
  
  def __init__(self, _x, _y):
    Particle.__init__(self, _x, _y)
    self.angle = randint(0, 360)
    
  def update(self):
    self.vel += self.acc
    self.loc += self.vel
    self.angle += 10
    self.angle %= 360
    self.lifespan -= uniform(0.5, 1.0)*3
    if self.lifespan <= 10:
      self.done = True
      
  def display(self):
    screen.setAlpha(self.lifespan/255)
    screen.setDrawRotation(self.angle)
    screen.fillRect(self.loc.x, self.loc.y, self.d, self.d, self.col)
    screen.drawRect(self.loc.x, self.loc.y, self.d, self.d, "rgb(33, 41, 70)")
    screen.setDrawRotation(0)
    screen.setAlpha(1.0)

Die update()-Methode erhielt zusätzliche Befehle, die für die Rotation zuständig waren und in display() wurde mit screen.setDrawRotation(self.angle) das rotierende Quadrat gezeichnet. Wie bei screen.setAlpha() darf nicht vergessen werden, den Wert anschließend wieder auf seinen Default zurückzusetzen.

In der Hauptroutine main war lediglich in update() eine zusätzliche Abfrage nötig, um den Zufallszahlengenerator zu befragen, ob man ein Quadrat oder einen Kreis erzeugt:

def update():
  choice = randint(0, 10)
  if choice <= 5:
    particle = Particle(START_X, START_Y)
  else:
    particle = RectParticle(START_X, START_Y)
  particles.append(particle)

Alles andere blieb wie in der letzten Version des Skriptes, das ich auch dieses Mal wieder auf meinem microStudio-Account hochgeladenhabe. Und das Hintergrundbild habe ich wieder von der gekünstelten Intelligenzia meines Vertrauens erstellen lassen (siehe unten). Um ein wenig Abwechslung in die Sache zu bringen, bestaunen dieses Mal zwei Jungen das Partikelsystem.

Das ist das zwöfte Tutorial meiner »microStudio mit Python«-Reihe. Alle bisher im Schockwellenreiter erschienenen Beiträge habe ich wieder hier aufgeführt, um Euch eine Suche zu ersparen:

Damit ist das Dutzend erst einmal voll. Ich werde die Reihe mindestens für ein paar Tage pausieren lassen, denn der hier auf diesen Seiten schon mehrfach erwähnte Freund aus Bremen hat mich auf die Idee gebracht, ein P5.js-Tutorial für absolute Beginner zu schreiben. Er wünschte sich das. Schaun wir mal, ob ich das hinbekomme. Ich habe jedenfalls Lust darauf. Still digging!


(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.