Gummiball-Tutorial

Versuchen wir, eine einfache Gummiball-Demo zu schreiben, bei der sich ein einzelnes Pixel über den Bildschirm bewegt und an dessen Rand abprallt. Dies wird uns mit der Library vertraut machen.

Beginne, indem du eine Datei mit dem Namen „code.py“ erstellst — da schreiben wir all unseren Code rein. Solange eine Datei mit diesem Namen existiert, wird PewPew beim Auf- oder Neustarten versuchen sie auszuführen. Später, wenn du mit deinem Game fertig bist, kannst du ihm einen beliebigen neuen Namen geben, und dann wird PewPew wieder standardmäßig „main.py“ ausführen, welches das Spielauswahlmenü beinhaltet.

Um die PewPew Library zu benutzen zu können, müssen wir sie zuerst in unseren Code importieren. Dafür müssen wir mit der folgenden Zeile beginnen:

import pew

Dann müssen wir die Library anweisen, den Bildschirm anzuschalten und alles vorzubereiten, was wir brauchen, um den Gummiball anzuzeigen. Das machen wir, indem wir die init Funktion wie folgt aufrufen:

import pew


pew.init()

Wir möchten, dass unsere Demo die ganze Zeit in einer Schleife läuft, dafür brauchen wir eine Endlosschleife. Wir können die Wiederholungen pro Sekunde auf 12 begrenzen, was langsam genug ist, um die Bewegungen zu sehen, aber nicht allzu langsam:

import pew


pew.init()
while True:
    pew.tick(1/12)

Des Weiteren brauchen wir ein Bild, das wir auf dem Bildschirm anzeigen werden. In PewPew werden Bilder als Pix-Objekte repräsentiert. Nun können wir ein leeres Bild in der Größe des gesamten Bildschirms erstellen und innerhalb unserer Endlosschleife darstellen:

import pew


pew.init()
screen = pew.Pix()
while True:
    pew.show(screen)
    pew.tick(1/12)

Jetzt fügen wir unser Pixel hinzu. Wir setzen dessen Ausgangsposition bei den Koordinaten 0, 0 und geben ihm die Farbe 3, welches die hellste ist:

import pew


pew.init()
screen = pew.Pix()
x = 0
y = 0
while True:
    screen.pixel(x, y, 3)
    pew.show(screen)
    pew.tick(1/12)

Und nun setzen wir unser Pixel in Bewegung:

import pew


pew.init()
screen = pew.Pix()
x = 0
y = 0
dx = 1
dy = 1
while True:
    x += dx
    y += dy
    screen.pixel(x, y, 3)
    pew.show(screen)
    pew.tick(1/12)

Wenn du das jetzt ausführst, wirst du sehen, wie sich auf dem Bildschirm eine Diagonale bildet. Das liegt daran, dass die vorherigen Positionen nicht gelöscht werden. Außerdem bewegt sich das Pixel weiterhin in diese Richtung, außerhalb des Bildschirms. Diese Probleme können wir beheben. Beginnen wir damit, die vorherigen Positionen zu löschen:

import pew


pew.init()
screen = pew.Pix()
x = 0
y = 0
dx = 1
dy = 1
while True:
    screen.pixel(x, y, 0)
    x += dx
    y += dy
    screen.pixel(x, y, 3)
    pew.show(screen)
    pew.tick(1/12)

Wir färben einfach das Pixel an der vorherigen Position wieder schwarz, bevor wir das helle Pixel an der neuen Position zeichnen. Da wir den Bildschirm nur einmal pro Frame neu laden, sind beide Veränderungen zur gleichen Zeit sichtbar. Und nun, lass uns dem Pixel die Fähigkeit geben, von den Wänden abzuprallen:

import pew


pew.init()
screen = pew.Pix()
x = 1
y = 1
dx = 1
dy = 1
while True:
    screen.pixel(x, y, 0)
    if not 0 < x < 7:
        dx = -dx
    if not 0 < y < 7:
        dy = -dy
    x += dx
    y += dy
    screen.pixel(x, y, 3)
    pew.show(screen)
    pew.tick(1/12)

Wir mussten die Ausgangsposition ein wenig verschieben, da das Pixel ansonsten in der Ecke feststecken würde. Jetzt solltest du sehen, wie unser Pixel von Ecke zu Ecke springt. Das ist nett, aber etwas langweilig. Vielleicht wäre es besser, wenn wir die Ausgangsposition verändern würden:

import pew


pew.init()
screen = pew.Pix()
x = 3
y = 1
dx = 1
dy = 1
while True:
    screen.pixel(x, y, 0)
    if not 0 < x < 7:
        dx = -dx
    if not 0 < y < 7:
        dy = -dy
    x += dx
    y += dy
    screen.pixel(x, y, 3)
    pew.show(screen)
    pew.tick(1/12)

Vielleicht können wir das Verhalten des Gummiballs mit den Tasten beeinflussen? Beispielsweise könnte man es mit der O Taste horizontal und mit der X Taste vertikal abspringen lassen:

import pew


pew.init()
screen = pew.Pix()
x = 3
y = 1
dx = 1
dy = 1
while True:
    keys = pew.keys()
    screen.pixel(x, y, 0)
    if not 0 < x < 7 or keys & pew.K_O:
        dx = -dx
    if not 0 < y < 7 or keys & pew.K_X:
        dy = -dy
    x += dx
    y += dy
    screen.pixel(x, y, 3)
    pew.show(screen)
    pew.tick(1/12)

Können wir einen schöneren Hintergrund als nur schwarz haben? Versuchen wir’s mit einem Schachbrett:

import pew


pew.init()
screen = pew.Pix()
background = pew.Pix.from_iter((
    (1, 0, 1, 0, 1, 0, 1, 0),
    (0, 1, 0, 1, 0, 1, 0, 1),
    (1, 0, 1, 0, 1, 0, 1, 0),
    (0, 1, 0, 1, 0, 1, 0, 1),
    (1, 0, 1, 0, 1, 0, 1, 0),
    (0, 1, 0, 1, 0, 1, 0, 1),
    (1, 0, 1, 0, 1, 0, 1, 0),
    (0, 1, 0, 1, 0, 1, 0, 1),
))
x = 3
y = 1
dx = 1
dy = 1
while True:
    keys = pew.keys()
    screen.blit(background)
    if not 0 < x < 7 or keys & pew.K_O:
        dx = -dx
    if not 0 < y < 7 or keys & pew.K_X:
        dy = -dy
    x += dx
    y += dy
    screen.pixel(x, y, 3)
    pew.show(screen)
    pew.tick(1/12)

Statt das Pixel jedes Mal mit einem schwarzen Pixel zu ersetzen, kopieren wir einfach den gesamten Hintergrund über den Schirm, und zeichnen dann unser Pixel an seiner neuen Position.

Wie wäre es, wenn wir den Gummiball größer machen:

import pew


pew.init()
screen = pew.Pix()
ball = pew.Pix.from_iter((
    (3, 2),
    (2, 1),
))
background = pew.Pix.from_iter((
    (1, 0, 1, 0, 1, 0, 1, 0),
    (0, 1, 0, 1, 0, 1, 0, 1),
    (1, 0, 1, 0, 1, 0, 1, 0),
    (0, 1, 0, 1, 0, 1, 0, 1),
    (1, 0, 1, 0, 1, 0, 1, 0),
    (0, 1, 0, 1, 0, 1, 0, 1),
    (1, 0, 1, 0, 1, 0, 1, 0),
    (0, 1, 0, 1, 0, 1, 0, 1),
))
x = 3
y = 1
dx = 1
dy = 1
while True:
    keys = pew.keys()
    screen.blit(background)
    if not 0 < x < 6 or keys & pew.K_O:
        dx = -dx
    if not 0 < y < 6 or keys & pew.K_X:
        dy = -dy
    x += dx
    y += dy
    screen.blit(ball, x, y)
    pew.show(screen)
    pew.tick(1/12)

Wir mussten die Grenzen des Bildschirms anpassen, da der Gummiball größer wurde.

Experimentiere jetzt mit diesem Code auf eigene Faust und sieh was du damit machen kannst.