Ein Mini-Spiel schreiben

tilegamelib

Die Python-Bibliothek tilegamelib vereinfacht das Verwenden der beliebten Bibliothek pygame. Sie erleichtert das Erstellen einfacher Spiele mit Klötzchengrafik. In diesem Projekt schreiben wir ein einfaches Labyrinth-Spiel mit einigen Zeilen Python-Code.

Zunächst installiere die Bibliothek mit:

pip install tilegamelib

1. Erstelle ein Spiel-Objekt

Die Grundlage für Spiele ist die Klasse tilegamelib.Game. Diese musst Du importieren:

from tilegamelib import Game

Nun kannst Du ein Game-Objekt erstellen und dessen Event-Schleife ausführen:

game = Game()
game.event_loop()

Beim Ausführen des Programms solltest du ein schwarzes Fenster sehen, das beim Drücken der Escape-Taste verschwindet. Bei einigen Entwicklungsumgebungen (darunter Anaconda Spyder) kann das Fenster im Hintergrund erscheinen. Suche es mit Alt+Tab.

2. Eine Spiel-Klasse

Schreibe Dir als nächstes eine Klasse für das Spiel, die sämtliche Daten für das Spiel enthält. Wir erstellen das Game-Objekt in dieser Klasse. Achte darauf, dass Du durch Voranstellen von self ein Attribut des Objekts daraus machst. Damit ist self.game in allen Funktionen dieser Klasse verfügbar.

class MazeGame:

    def __init__(self):
        self.game = Game()
        self.game.event_loop()

Nun musst Du eine Instanz der Klasse MazeGame bilden. Es ist üblich, dazu einen __main__-Abschnitt am Ende der Datei zu verwenden:

if __name__ == '__main__':
    maze_game = MazeGame()

3. Zeichnen einer Karte

Die Klasse tilegamelib.TiledMap kümmert sich um das Zeichnen von 2D-Karten, die aus quadratischen Kacheln bestehen. Importiere diese:

from tilegamelib import TiledMap

Erstelle in der Funktion __init__ eine neue Karte und füllen sie mit Wänden ('#') auf:

self.map = TiledMap(self.game)
self.map.fill_map('#', (10, 10))

Noch siehst Du nichts. Zuerst benötigst Du eine neue Methode in MazeGame, die sich um das Zeichnen der Karte kümmert:

def draw(self):
    self.map.draw()

Du mußt außerdem den Aufruf von event_loop() so verändern, dass unsere draw()-Methode in regelmäßigen Abständen aufgerufen wird. Achte darauf, dass event_loop() als letztes in der Methode __init__() aufgerufen wird.

self.game.event_loop(draw_func=self.draw)

Nun solltest Du eine Art blaues Gitter sehen.

4. Inhalt der Karte

Damit auf dem Bildschirm etwas mehr los ist, setzen wir den Inhalt der Karte auf einen String mit 10 Zeilen von jeweils 10 Zeichen:

MAZE = """##########
#........#
#.#.####.#
#.#......#
#.#....#.#
#.#....#.#
#......#.#
#.####.#.#
#........#
##########"""

Diesen String schicken wir an das TiledMap-Objekt:

self.map.set_map(MAZE)

Es gibt mehrere vordefinierte Grafikelemente:

Zeichen Beschreibung
# Wand
. leer
* Punkt
x dunkle Kiste
X helle Kiste
a-h Früchte
d Diamant
+ Stern
@ blauer Punkt

5. Sprites

Du kannst Sprites, bewegliche Objekte definieren:

from tilegamelib.sprites import Sprite

Ein Sprite muss ebenfalls in __init__ erstellt werden (wieder vor dem Aufruf von event_loop). Unserem Sprite hier geben wir ein bekanntes "Gesicht":

self.sprite = Sprite(self.game, 'b.pac_right', (1, 1), speed=2)

In draw() zeichnen wir den Sprite:

self.sprite.draw()

6. Action!

Nun soll sich der Sprite bewegen. Die Klasse Game kümmert sich um das Abfragen der Tastatur. Wir müssen nur noch die Pfeiltasten auf unsere eigene Bewegungs-Methode umleiten. Da dies in vielen Spielen nötig ist, ist dazu in tilegamelib schon etwas vorgesehen. Schreibe:

def move(self, direction):
    print(direction)

Und modifiziere den Aufruf von event_loop():

self.game.event_loop(figure_moves=self.move, draw_func=self.draw)

Nun solltest Du sehen, dass direction einen anderen Vektor für jede Pfeiltaste enthält. Wir können diesen Vektor an sprite übergeben, so dass dieser sich bewegt:

self.sprite.add_move(direction)

Um die Bewegung auszuführen, müssen wir self.sprite.move() in regelmäßigen Abständen aufrufen. Füge zur Methode draw() folgenden Befehl hinzu:

self.sprite.move()

Nun sollte sich die Figur durch das Labyrinth bewegen!

7. Fragen

7.1 Wie kann ich prüfen, welche Kachel an der Position der Figur liegt?

print(self.map.at(self.sprite.pos))

7.2 Wie kann ich prüfen, an welche Position sich der Sprite bewegt?

print(self.sprite.pos + direction)

7.3 Wie kann ich etwas auf der Karte platzieren?

self.map.set_tile((4,4), 'a')

7.4 Was für Kacheln gibt es noch?

Siehe in der Datei tiles.conf nach.

7.5 Kann ich Text schreiben?

self.game.frame.print_text("Hello World", (50, 400))

7.6 Ich möchte einen Geist programmieren, der sich zufällig bewegt. Wie?

Du findest alle wichtigen Vektoren mit:

from tilegamelib.vector import UP, DOWN, LEFT, RIGHT

Platziere den Code zum Bewegen eines Geistes zu Beginn von draw().

8. Schreibe ein Spiel!

Die Dokumentation von tilegamelib ist noch recht dürftig. Insbesondere, wie Du eigene Grafiken, Tasten und Soundeffekte hinzufügen kannst. Bitte berichte Fragen und mögliche Fehler auf GitHub oder per E-Mail an [email protected].

results matching ""

    No results matching ""