Mein kleines, bonbonbuntes Aquarium als Trinket

Python
Processing
Trinket
Turtle
Autor:in

Jörg Kantel

Veröffentlichungsdatum

26. Februar 2023

Als vorläufigen Höhepunkt meiner Erkundung der Möglichkeiten des Processing/Python-Modes in Trinket habe ich mein schon in vielen Versionen (zum Beispiel hier in TigerJython und hier in Py5) impementiertes, kleines, bonbonbuntes Aquarium auch nach Trinket portiert.

Dabei habe ich weitestgehend die Py5-Version übernommen, denn außer dem Hinzufügen der trinketüblichen import-Anweisung und der letzten run()-Zeile konnte ich nach der Umwandlung der Processing-Befehle vom snake_case in den camelCase den Sketch nahezu Eins-zu-Eins übernehmen:

from processing import *
from random import randint

WIDTH, HEIGHT = 640, 416
N_FISHES = 15

class Background():
  
  def __init__(self, _img):
    self.img = loadImage(_img)
    
  def display(self):
    image(self.img, 0, 0)

class Fish():
  
  def __init__(self, _idx, _x, _y, _dir, _speed):
    self.imgr0 = loadImage("fish" + str(_idx) + "r_0.png")
    self.imgl0 = loadImage("fish" + str(_idx) + "l_0.png")
    self.imgr1 = loadImage("fish" + str(_idx) + "r_1.png")
    self.imgl1 = loadImage("fish" + str(_idx) + "l_1.png")
    self.x = _x
    self.y = _y
    self.dir = _dir
    if self.dir == "rt":
      self.img = self.imgr0
    elif self.dir == "lt":
      self.img = self.imgl0
    self.speed = _speed*randint(1, 3)
    self.switch = 5
    self.timer = self.switch
    
  def update(self):
    self.x += self.speed
    if self.timer <= 0:
      self.timer = self.switch
      if self.img == self.imgr0:
        self.img = self.imgr1
      elif self.img == self.imgr1:
        self.img = self.imgr0
      elif self.img == self.imgl0:
        self.img = self.imgl1
      elif self.img == self.imgl1:
        self.img = self.imgl0
    if self.x > width + randint(40, 200):
      self.img = self.imgl0
      self.y = randint(20, 300)
      self.speed = randint(-3, -1)
    if self.x < randint(-200, -40):
      self.img = self.imgr0
      self.y = randint(20, 300)
      self.speed = randint(1, 3)
    self.timer -= 1
 
  def display(self):
    image(self.img, self.x, self.y)

fishes = []

def setup():
  global bg
  size(WIDTH, HEIGHT)
  print("🐠 Jörgs kleines, bonbonbuntes Aquarium 🐡")
  bg = Background("background.png")
  for _ in range(N_FISHES):
    direction = randint(0, 1)
    if direction == 0:
      dr = "rt"
      speed = 1
    else:
      dr = "lt"
      speed = -1
    x = randint(-100, width + 200)
    y = randint(20, 300)
    fish = Fish(randint(1, 7), x, y, dr, speed)
    fishes.append(fish)

def draw():
  background(49, 197, 244) # Hellblau
  bg.display()
  for fish in fishes:
    fish.update()
    fish.display()

run()

Lediglich die Pfadangaben für die Bildchen, die – immer noch – aus dem freien (CC0 1.0 Universal) FishPack von Kenney.nl stammen, mußte ich, nachdem ich sie in mein Trinket hochgeladen hatte, anpassen (sie liegen dort per Default im gleichen Verzeichnis wie das Skript). Danach wuselten die Fische durch das Aquarium, als hätte es gar keinen Umzug gegeben:

Geil ist natürlich auch, daß man das fertige Trinket relativ einfach in die eigene Website einbinden kann (man verliert aber dadurch eventuell das responsive Verhalten der Seite). Und daß Trinket Emojis beherrscht, hatte ich erwartet, aber hier noch einmal getestet.

Hier findet Ihr das fertige Trinket zum Kopieren/Nachvollziehen und für eigene Experimente.

Jetzt habe ich erst einmal genug mit dem Processing-Mode von Trinket experimentiert. Bis zu meinem Abschied von TigerJython (wegen der seltsamen proprietären Lizenz) war ich jedoch auch von dem Turtle-Mode des Tigers fasziniert. Trinket soll ebenfalls eine leistungsfähige Schildkröten-Implementierung besitzen. Die werde ich mir als nächstes mal vorknöpfen. Dafür werde ich zum wiederholten Mal die Videos von TokyoEdtech (aka Christian Thompson) plündern. (Ihr erinnert Euch? Das ist der Mann, der Unglaubliches mit Pythons Turtle anstellt. Die kann man sich daher gar nicht oft genug anschauen.) Ihr seht, ich habe zu tun. Still digging!