Anleitung: Labyrinth-Spiel#
In diesem Kapitel erstellen wir Schritt für Schritt ein Labyrinth-Spiel.
Die Technik, eine Kachelkarte (Tilemap) zu erstellen, ist in vielen Spielen üblich. Sobald du sie hier gelernt hast, kannst du sie in eigenen Projekten anwenden.
Basierend auf:
https://github.com/electronstudio/pygame-zero-book
Lizenz: Namensnennung-NichtKommerziell-Weitergabe unter gleichen Bedingungen 4.0 International
Schritt 1: Actor aus einer Kachelkarte laden#
Eine Kachelkarte verwendet eine kleine Anzahl von Bildern (Kacheln), die mehrfach gezeichnet werden, um ein großes Spiellevel zu erstellen. Das spart Aufwand bei der Grafikerstellung und macht das Leveldesign übersichtlicher. In diesem Beispiel erstellen wir ein Labyrinth-Level.
Du benötigst zwei Bilddateien: player.png
und wall.png
. Speichere sie im Ordner mu_code/images
:
my_code
|
|--images
|----player.png
|----wall.png
Jetzt richten wir das Grundgerüst für das Spiel ein.
Eine Welt erstellen#
Nutze diese Grundstruktur für dein Spiel:
In Zeile 2 wird eine TiledWorld
erstellt, die die Logik für gekachelte Welten bereitstellt. Am Ende musst du world.run()
aufrufen, um das Spiel zu starten.
from miniworlds import *
world = TiledWorld(8, 8)
world.tile_size = 64
world.add_background((0, 0, 0, 255))
# Your code here
world.run()
Actor-Unterklassen erstellen#
Erstelle eine Unterklasse für jeden Typ von Actor:
class Player(Actor):
def on_setup(self):
self.add_costume("player")
self.layer = 1
class Wall(Actor):
def on_setup(self):
self.add_costume("wall")
self.add_costume
fügt dem Actor ein Kostüm hinzu – entweder basierend auf einem Bild (z. B. "player"
, "wall"
, wobei die Endung .png
weggelassen werden kann) oder einer Farbe als (r, g, b, a)-Tupel.
Eine Kachelkarte erstellen#
Eine Kachelkarte ist eine 2D-Liste, die bestimmt, wo jeder Actor platziert wird.
0: Leer
1: Wand
2: Spieler
tiles = [None, Wall, Player]
maze = [
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 0, 1, 2, 0, 1],
[1, 0, 1, 0, 1, 1, 0, 1],
[1, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 1, 0, 0, 1],
[1, 0, 1, 0, 1, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1]
]
Objekte für jede Kachel erzeugen#
Erzeuge Actor für jede Kachel. Die zu erstellende Klasse wird aus der Liste tiles
bestimmt:
@world.register
def on_setup(self):
for row in range(len(maze)):
for column in range(len(maze[row])):
actor_cls = tiles[maze[row][column]]
if actor_cls:
actor_cls(column, row)
Schritt 2: Bewegung#
Spieler bewegen#
Füge dies zur Player
-Klasse hinzu, um den Spieler zu bewegen:
class Player(Actor):
def on_setup(self):
self.add_costume("player")
self.layer = 1
def on_key_down(self, keys):
if "UP" in keys:
self.y -= 1
elif "DOWN" in keys:
self.y += 1
elif "LEFT" in keys:
self.x -= 1
elif "RIGHT" in keys:
self.x += 1
Bewegung blockieren#
Verwende die Methode move_back()
, um Bewegungen in Wände zu verhindern:
def on_key_down(self, keys):
if "UP" in keys:
self.y -= 1
elif "DOWN" in keys:
self.y += 1
elif "LEFT" in keys:
self.x -= 1
elif "RIGHT" in keys:
self.x += 1
if self.detect_actor(Wall):
self.move_back()
Einen Gegner erstellen#
Erstelle eine Enemy
-Klasse, die dem Spieler folgt:
class Enemy(Actor):
def on_setup(self):
self.add_costume("enemy")
self.velocity = 1
self.layer = 1
def act(self):
self.y += self.velocity
if self.detect_actor(Wall):
self.move_back()
self.velocity = -self.velocity
if self.detect_actor(Player):
print("You were caught!")
exit()
Zusammenfassung#
In diesem Tutorial hast du ein einfaches Labyrinth-Spiel mit beweglichen Actorn und einer Kachelkarte erstellt. Mit dieser Grundlage kannst du weitere Funktionen wie Punktzahlen, Level oder intelligentere Gegner hinzufügen!