Menu
CoddyTech

Un fondo de losetas

Parte de la sección Mundos del Journey de Pygame de Coddy. Lección 9 de 35.

Un color liso detrás del nivel se ve vacío. assets/backgrounds/clouds.png es una imagen de 72 por 72 diseñada para repetirse: su borde izquierdo coincide con el derecho, y el borde superior coincide con el inferior. Cópiala en una cuadrícula que cubra la ventana:

for y in range(0, 360, 72):
    for x in range(0, 576, 72):
        screen.blit(background, (x, y))

range(0, 576, 72) genera 0, 72, 144 y así sucesivamente hasta 504, el último inicio que todavía se muestra. 576 es múltiplo de 72, así que la última copia termina en el borde de la ventana. El fondo reemplaza a screen.fill: cubre cada píxel.

El orden importa. Lo que copies después cubre lo que ya está, así que dibuja primero el fondo y luego las baldosas encima.

challenge icon

Desafío

Fácil

El código inicial carga assets/backgrounds/clouds.png en background.

  1. En el bucle del juego, en lugar de screen.fill, dibuja background en cada valor de x desde 0 hasta 576 en incrementos de 72, para cada valor de y desde 0 hasta 360 en incrementos de 72.
  2. Dibuja las losetas después del fondo.

Pruébalo tú mismo

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()

Todas las lecciones de Mundos

Practica por tu cuenta: Playground de Pygame