Menu
CoddyTech

Где начинает игрок

Часть раздела Игровые миры путешествия по Pygame на Coddy. Урок 4 из 35.

Уровень определяет, где появляется игрок, поэтому добавь эту информацию и на карту: одну P. Пока циклы считывают карту, клетка P задаёт начальную позицию игрока.

elif char == "P":
    player = pygame.Rect(col * TILE + 4, row * TILE + 4, 28, 28)

Игрок — это квадрат со стороной 28 пикселей, поэтому он появляется на расстоянии (36 - 28) / 2 = 4 пикселя от угла клетки, посередине клетки. Теперь достаточно переместить P в тексте, чтобы изменить начальную позицию: ничего не нужно вычислять.

Цикл выполняется до игрового цикла, поэтому к моменту перемещения игрока игровым циклом player уже существует. Убедись, что после циклов нигде снова не задаётся player, иначе сработает эта более поздняя строка.

challenge icon

Задание

Легко

Теперь на карте есть P. В начальном коде игрок размещается в фиксированной позиции (40, 40).

  1. В циклах обработки карты для P задайте player = pygame.Rect(col * TILE + 4, row * TILE + 4, 28, 28).
  2. Удалите строку, которая размещает игрока в позиции (40, 40).

Попробуйте сами

import pygame

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

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

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Map from Text")
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))
player = pygame.Rect(40, 40, 28, 28)

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

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 4
    if keys[pygame.K_RIGHT]:
        player.x += 4
    if keys[pygame.K_UP]:
        player.y -= 4
    if keys[pygame.K_DOWN]:
        player.y += 4

    screen.fill((30, 30, 46))
    for wall in walls:
        pygame.draw.rect(screen, WALL, wall)
    for coin in coins:
        pygame.draw.rect(screen, COIN, coin)
    pygame.draw.rect(screen, PLAYER, player)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Игровые миры

Потренируйтесь самостоятельно: Песочница Pygame