Изображения тайлов
Часть раздела Игровые миры путешествия по Pygame на Coddy. Урок 6 из 35.
Коричневые прямоугольники показывают, где находятся стены. Изображения превращают уровень в подобие места. Загрузите изображение каждой плитки один раз, после set_mode:
block_img = pygame.image.load("assets/images/block.png").convert_alpha()
coin_img = pygame.image.load("assets/images/coin.png").convert_alpha()Размер каждой плитки — 36 на 36, как у плитки карты, поэтому она помещается в сетку без масштабирования. У изображения монеты есть пустая рамка, поэтому выводите его в углу плитки, и монета окажется посередине.
Храните данные о том, что нужно нарисовать, в одном списке пар: какое изображение и где. tiles.append((block_img, rect)) добавляет пару; игровой цикл выводит их все:
for image, rect in tiles:
screen.blit(image, rect)Цикл распаковывает каждую пару в image и rect.
Задание
Легко- После
set_modeзагрузиassets/images/block.pngвblock_img, аassets/images/coin.png— вcoin_img, применив к каждомуconvert_alpha(). - Перед игровым циклом создай список с именем
tiles: для каждого#добавь пару(block_img, pygame.Rect(col * TILE, row * TILE, TILE, TILE)); для каждогоC—(coin_img, ...)с таким же Rect. - В игровом цикле выводи на экран каждую пару из
tilesвместо рисования коричневых и жёлтых прямоугольников.
Попробуйте сами
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()
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Игровые миры
Потренируйтесь самостоятельно: Песочница Pygame