Bewegte Bilder auf PicoBoy Color
technische Daten wie beim RPi Pico
Microcontroller RP2040 - 1,69 Zoll Farbdisplay mit 240 x 280 Pixeln
Projekte und Anleitung in CircuitPython 9.x.x
Bildbox 1 (klick hier)
Bewegte Bilder auf PicoBoy Color
technische Daten wie beim RPi Pico
Microcontroller RP2040 - 1,69 Zoll Farbdisplay mit 240 x 280 Pixeln
Projekte und Anleitung in CircuitPython 9.x.x
Bildbox 1 (klick hier)
Hardware
- PicoBoy-Color
Sprite_sheet anlegen
Da der PicoBoy-Color 240x 280 Pixel darstellt, habe ich mich entschieden, die einzelnen Sprites 40x40 Pixel zu gestalten. Daraus kann dann
mit 6 Reihen (0 bis 5) und 7 Spalten (0 bis 6) das Hintergrundbild gestaltet werden. In der oberen Bildbox ist ein Beispiel dafür zu sehen.
Sicher können Sie schon erahnen, dass sich aus diesen 21 Sprites noch viele andere Hintergrundbilder kombinieren lassen, die nicht noch einmal
geladen werden müssen, sondern einfach mit einer neuen Matrix definiert werden. Ich nenne diese in meinen Beispielen 'Floor'.
Ich habe die 'Sprites' in 7 Reihen zu je 3 nebeneinander angeordnet. Daraus ergibt sich eine Bitmap-Datei mit 120x280 Pixeln.
Ganz wichtig ist, dass die Pixelanzahl genau stimmt und der Inhalt jeder Kachel genau die 40x40 Pixel füllt. Laden Sie sich mein Muster
floor.bmp von hier herunter,
entpacken es und speichen es in den Ordner 'images', um es in den nachfolgenden Tests zu verwenden.
Kopieren Sie den Code aus dem unteren Kasten ins Thonny und schauen sich die Erläuterungen an:
1 import board 2 import busio 3 import displayio 4 import terminalio 5 import digitalio 6 from adafruit_st7789 import ST7789 7 import adafruit_imageload 8 9 # 1,69 Zoll 240x280 Pixel ST7789 Display 10 # SPI, in Landscape format 11 dc=board.GP8 12 reset=board.GP9 13 cs=board.GP10 14 sck=board.GP18 15 mosi=board.GP19 16 bl=board.GP26 17 # Release any resources currently in use for the displays 18 displayio.release_displays() 19 spi = busio.SPI(sck, mosi) 20 display_bus = displayio.FourWire(spi, command=dc, chip_select=cs, reset=reset) 21 display = ST7789(display_bus, rotation=90, width=280, height=240, backlight_pin=bl, rowstart=20, colstart=0) 22 display.brightness = 1 23 24 # Load the backgr sprite sheet (bitmap) 25 sprite_sheet, palette = adafruit_imageload.load("/images/floor.bmp", bitmap=displayio.Bitmap, palette=displayio.Palette) 26 backgr_group = displayio.TileGrid(sprite_sheet, pixel_shader=palette, width=7, height=6, tile_width=40, tile_height=40, default_tile=7) 27 28 backgr = [15, 16, 13, 13, 13, 13, 13, 29 18, 19, 20, 14, 20, 14, 20, 30 7, 7, 7, 1, 3, 7, 7, 31 7, 1, 5, 5, 5, 8, 6, 32 7, 0, 7, 7, 7, 7, 2, 33 12, 0, 12, 12, 4, 10, 11] 34 35 def floor(): 36 # show the 42 sprites 37 for x in range(0, 7): 38 for y in range(0, 6): 39 backgr_group[x, y] = backgr[y*7 +x] 40 41 main = displayio.Group() 42 main.append(backgr_group) 43 44 display.root_group = main 45 46 floor() 47
Zunächst werden in den Zeilen 1 bis 22 wie gehabt die Bibliotheken importiert und das Display initialisiert. Dann wird in Zeile 25
die Bitmap-Datei mit den 'Sprites' unter dem Namen 'sprite_sheet' geladen. Diese wird dann in Zeile 26 einer TileGrid
(dt. Kachelgitter) mit dem Namen 'backgr_group' hinzugefügt. Dabei werden folgende Werte festgelegt:
- width = 7 : Anzahl der Spalten auf dem Display
- height = 6 : Anzahl der Zeilen auf dem Display
- tile_width = 40 : Kachelbreite 40 Pixel
- tile_height = 40 : Kachelhöhe 40 Pixel
- default_tile = 7 : Standardwert der Kachel (Sprite 7 - siehe oben)
Insgesamt brauchen wir 42 Kacheln (6 Zeilen mit jeweils 7 Kacheln). Dazu wird in Zeile 28 eine Liste 'backgr' mit
den Nummern der gewünschten Kacheln definiert (siehe Zeilen 28 bis 33). Es ist hilfreich, vorher auf einem karierten Blatt die
42 Kacheln zu skizzieren und das gewünschte Displaybild zu entwerfen. Dann entnimmt man einem Ausdruck der Datei 'floor.bmp' mit den
beschrifteten Kacheln 0 bis 20 die jeweilige Nummer für die Liste 'backgr'.
Um das Ganze jetzt auf dem Display darzustellen, habe ich eine Funktion floor() (in Zeile 35) definiert, welche aus
der Zeile 46 aufgerufen wird. In der Funktion werden in einer ineinander geschachtelten Schleife für 7 Spalten (x-Werte) und 6 Zeilen
(y-Werte) der TileGrid 'backgr_group' die Sprites zugewiesen. Anschließend wird eine Displayio.Gruppe 'main'
definiert, welcher die 'backgr_group' hinzugefügt wird. In Zeile 44 ist 'display.root_group = main' der Befehl zur
Displayanzeige, welcher seit Version 8.x.x den alten Befehl 'display.show()' ersetzt.
Mit einer kleinen Ergänzung lässt sich zeigen, dass der Hintergrund während des Programmlaufs leicht verändert werden kann,
z.B. als Reaktion auf eine bestimmte Programmsituation.
48 import time 49 while True: 50 time.sleep(3) 51 backgr_group[5, 3] = 7 52 backgr_group[4, 2] = 0 53 backgr_group[1, 4] = 3 54 backgr_group[1, 3] = 0 55 backgr_group[1, 2] = 3 56 time.sleep(3) 57 floor()