Randkacheln
Teil des Abschnitts Spielwelten der Pygame-Journey von Coddy. Lektion 8 von 35.
Eine Plattform sieht erst dann fertig aus, wenn ihre Enden abgerundet sind. Das Paket enthält grass_left.png und grass_right.png für die beiden Enden einer Grasfläche.
Jetzt betrachtet jedes Feld drei Nachbarfelder: oben, links und rechts. Einige davon liegen außerhalb der Karte, an den Rändern. Eine Hilfsfunktion gibt für jede Position an, ob sie belegt ist – innerhalb oder außerhalb der Karte:
def solid(row, col):
if row < 0 or row >= len(LEVEL) or col < 0 or col >= len(LEVEL[0]):
return False
return LEVEL[row][col] == "#"Außerhalb der Karte zählt als leer. Mit der Hilfsfunktion entspricht die Auswahl direkt der Regel:
if solid(row - 1, col):
image = dirt_img
elif not solid(row, col - 1) and solid(row, col + 1):
image = grass_left_img
elif solid(row, col - 1) and not solid(row, col + 1):
image = grass_right_img
else:
image = grass_img
tiles.append((image, pygame.Rect(x, y, TILE, TILE)))Ein Feld mit Boden auf beiden Seiten oder auf keiner Seite behält das einfache Gras. Am linken Kartenrand, in Spalte 0, liegt das Feld links außerhalb der Karte. Es zählt also als leer, und der Boden beginnt dort mit grass_left_img.
Aufgabe
MittelDer Starter lädt grass_left.png in grass_left_img und grass_right.png in grass_right_img.
- Schreibe eine Funktion
solid(row, col), die außerhalb der KarteFalseund innerhalbLEVEL[row][col] == "#"zurückgibt. - Für jedes
#:dirt_img, wenn das Feld darüber fest ist; andernfallsgrass_left_img, wenn nur der rechte Nachbar fest ist; andernfallsgrass_right_img, wenn nur der linke Nachbar fest ist; andernfallsgrass_img.
Probier es selbst
import pygame
TILE = 36
LEVEL = [
"###.............",
"###.............",
"..........C.....",
".........####...",
"..C.............",
".####......C....",
"..........###...",
"#....C.........#",
"###..##...###.##",
"######..########",
]
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Tiles")
clock = pygame.time.Clock()
grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
grass_left_img = pygame.image.load("assets/images/grass_left.png").convert_alpha()
grass_right_img = pygame.image.load("assets/images/grass_right.png").convert_alpha()
dirt_img = pygame.image.load("assets/images/dirt.png").convert_alpha()
coin_img = pygame.image.load("assets/images/coin.png").convert_alpha()
tiles = []
for row, line in enumerate(LEVEL):
for col, char in enumerate(line):
x, y = col * TILE, row * TILE
if char == "#":
if row == 0 or LEVEL[row - 1][col] != "#":
image = grass_img
else:
image = dirt_img
tiles.append((image, pygame.Rect(x, y, TILE, TILE)))
elif char == "C":
tiles.append((coin_img, pygame.Rect(x, y, TILE, TILE)))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((140, 200, 240))
for image, rect in tiles:
screen.blit(image, rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Spielwelten
1Karten aus Text
Ein Level in TextformZeilen und SpaltenBuchstaben mit BedeutungWo der Spieler startetEin Bildschirm nach dem anderen4Kollisionen mit Plattformen
Wände links und rechtsAuf Plattformen landenStoß dir den KopfAus dem Level fallenEine Achse nach der anderen3Schwerkraft und Springen
Fallen mit SchwerkraftVom Boden springenKurze SprüngeEine maximale FallgeschwindigkeitSprungpuffer6Patrouillierende Gegner
Ein patrouillierender BlobDrauftreten oder getroffen werdenEin GehzyklusGegner aus der KarteÜbe selbstständig: Pygame-Playground