Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Der Starter lädt assets/backgrounds/clouds.png in background.

  1. Blitte in der Spielschleife statt screen.fill background für jedes y von 0 bis 360 in Schritten von 72 bei jedem x von 0 bis 576 in Schritten von 72.
  2. 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

Übe selbstständig: Pygame-Playground