Menu
CoddyTech

Obrazy kafelków

Część sekcji Światy ścieżki Pygame w Coddy. Lekcja 6 z 35.

Brązowe prostokąty pokazują, gdzie znajdują się ściany. Obrazy sprawiają, że poziom wygląda jak miejsce. Wczytaj każdy obraz kafelka raz, po set_mode:

block_img = pygame.image.load("assets/images/block.png").convert_alpha()
coin_img = pygame.image.load("assets/images/coin.png").convert_alpha()

Każdy kafelek ma wymiary 36 na 36, czyli tyle samo co kafelek mapy, więc pasuje do siatki bez skalowania. Obraz monety ma pusty margines, więc narysuj go w rogu kafelka, a moneta znajdzie się na środku.

Przechowuj elementy do narysowania na jednej liście par: który obraz i gdzie. tiles.append((block_img, rect)) dodaje parę; pętla gry rysuje je wszystkie:

for image, rect in tiles:
    screen.blit(image, rect)

Pętla rozpakowuje każdą parę na image i rect.

challenge icon

Wyzwanie

Łatwy
  1. Po set_mode wczytaj assets/images/block.png do block_img, a assets/images/coin.png do coin_img, każde z użyciem convert_alpha().
  2. Przed pętlą gry utwórz listę o nazwie tiles: dla każdego # dodaj parę (block_img, pygame.Rect(col * TILE, row * TILE, TILE, TILE)); dla każdego C dodaj (coin_img, ...) z tym samym wywołaniem Rect.
  3. W pętli gry wywołaj blit dla każdej pary z tiles zamiast rysować brązowe i żółte prostokąty.

Spróbuj swoich sił

import pygame

TILE = 36
WALL = (120, 90, 60)
COIN = (255, 196, 0)

LEVEL = [
    "###.............",
    "###.............",
    "..........C.....",
    ".........####...",
    "..C.............",
    ".####......C....",
    "..........###...",
    "#....C.........#",
    "###..##...###.##",
    "######..########",
]

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Tiles")
clock = pygame.time.Clock()

walls = []
coins = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        if char == "#":
            walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))
        elif char == "C":
            coins.append(pygame.Rect(col * TILE + 10, row * TILE + 10, 16, 16))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((140, 200, 240))
    for wall in walls:
        pygame.draw.rect(screen, WALL, wall)
    for coin in coins:
        pygame.draw.rect(screen, COIN, coin)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Światy

Poćwicz samodzielnie: Edytor online Pygame