Menu
CoddyTech

图块图像

本课属于 Coddy Pygame 学习旅程的“游戏世界”单元。第 6 课,共 36 课。

棕色矩形表示墙壁的位置。图像让关卡看起来像一个真实的场景。在 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 中。

challenge icon

挑战

简单

用图片绘制关卡,而不是用矩形。

  1. 在 set_mode 之后,将 assets/images/block.png 加载到 block_img,将 assets/images/coin.png 加载到 coin_img,并使用 convert_alpha()。
  2. 构建一个列表 tiles:对于每个 #,添加 (block_img, pygame.Rect(col * TILE, row * TILE, TILE, TILE));对于每个 C,添加具有相同 Rect 的 (coin_img, ...)。
  3. 绘制 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 在线编辑器