Ein gekachelter Hintergrund
Teil des Abschnitts Spielwelten der Pygame-Journey von Coddy. Lektion 9 von 35.
Eine einfarbige Fläche hinter dem Level wirkt leer. assets/backgrounds/clouds.png ist ein 72 mal 72 Pixel großes Bild, das sich wiederholen lässt: Seine linke Kante passt zur rechten Kante und seine obere zur unteren. Zeichne es in einem Raster, das das Fenster abdeckt:
for y in range(0, 360, 72):
for x in range(0, 576, 72):
screen.blit(background, (x, y))range(0, 576, 72) ergibt 0, 72, 144 und so weiter bis 504, dem letzten Startpunkt, der noch sichtbar ist. 576 ist ein Vielfaches von 72, daher endet die letzte Kopie am Fensterrand. Der Hintergrund ersetzt screen.fill: Er bedeckt jedes Pixel.
Die Reihenfolge ist wichtig. Was du später aufzeichnest, überdeckt, was bereits da ist. Zeichne also zuerst den Hintergrund und dann die Kacheln darüber.
Aufgabe
EinfachDer Starter lädt assets/backgrounds/clouds.png in background.
- Blitte in der Spielschleife statt
screen.fillbackgroundfür jedes y von 0 bis 360 in Schritten von 72 bei jedem x von 0 bis 576 in Schritten von 72. - Zeichne die Kacheln nach dem Hintergrund.
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()
background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
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] == "#"
tiles = []
for row, line in enumerate(LEVEL):
for col, char in enumerate(line):
x, y = col * TILE, row * TILE
if char == "#":
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)))
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()
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