Menu
CoddyTech

Şövalye Yürüyor

Coddy'nin Pygame Journey'sinin Projeler bölümünün bir parçası. Ders 22 / 31.

Şövalye haritanın P karesinde başlar ve ok tuşlarıyla kare başına 3 piksel ilerler.

Resmi tam bir karo boyutundadır: 48'e 48 piksel. Duvarlar arasındaki boşluklar da aynı boyuttadır. 48 piksel boyutunda bir Rect, boşluğa yalnızca tam piksel hizasında sığar. Bu yüzden şövalyenin Rect'i resminden küçüktür, 32'ye 32 piksel boyutundadır ve resim bunun ortasına çizilir. Çarpışan Rect'tir; gördüğün ise resimdir.

def draw(image, rect):
    screen.blit(image, image.get_rect(center=rect.center))


def cell_rect(col, row):
    rect = pygame.Rect(0, 0, 32, 32)
    rect.center = (col * TILE + 24, row * TILE + 24)
    return rect

Duvarlar, Moss Caves'teki platformlarda olduğu gibi onu durdurur: x boyunca hareket et, üst üste geldiği duvarlardan dışarı it, ardından aynı işlemi y boyunca yap. Her seferinde tek bir eksende hareket etmek, hangi taraftan çarptığını anlamanı sağlar.

def move(self, dx, dy, blocks):
    self.rect.x += dx
    for block in blocks:
        if self.rect.colliderect(block):
            if dx > 0:
                self.rect.right = block.left
            elif dx < 0:
                self.rect.left = block.right
    # ardından bottom ve top ile dy için de aynısını yap
challenge icon

Görev

Zor
  1. Yukarıya draw ve cell_rect işlevlerini ekleyin.
  2. Room içinde, döngüden önce self.start = (72, 72) ayarlayın ve bir P için self.start = cell_rect(col, row).center ayarlayın.
  3. class Knight(pygame.sprite.Sprite) yazın: __init__(self, center) yöntemi self.image = knight_img ve center üzerinde ortalanmış 32'ye 32 boyutlarında bir self.rect ayarlar. Yukarıdaki move(dx, dy, blocks) yöntemini y bölümüyle birlikte ekleyin.
  4. Oda tanımlandıktan sonra knight = Knight(room.start) oluşturun.
  5. Her karede, Sol tuşuyla dx değerini -3, Sağ tuşuyla 3 olarak ayarlayın; Yukarı tuşuyla dy değerini -3, Aşağı tuşuyla 3 olarak ayarlayın (aksi hâlde 0), ardından knight.move(dx, dy, room.walls) çağrısını yapın.
  6. Şövalyeyi duvarlardan sonra çizin: draw(knight.image, knight.rect).

Kendin dene

import pygame

TILE = 48
MAP = [
    "##############",
    "#............#",
    "#.P......K...#",
    "#............#",
    "#....##......D",
    "#....##......#",
    "##.#######.###",
    "#............#",
    "#...S....H...#",
    "##############",
]

pygame.init()
screen = pygame.display.set_mode((672, 480))
pygame.display.set_caption("Rune Keep")
clock = pygame.time.Clock()
font = pygame.font.Font("assets/fonts/pixel.ttf", 32)


def load(name):
    return pygame.image.load("assets/images/" + name).convert_alpha()


floor_img = load("floor.png")
wall_img = load("wall.png")
knight_img = load("knight.png")
door_img = load("dungeon_door.png")
key_img = load("key.png")
slime_img = load("slime.png")
spider_img = load("spider.png")
heart_img = load("heart.png")
empty_img = load("heart_empty.png")
sword_img = load("sword.png")
potion_img = load("potion_red.png")


class Room:
    def __init__(self, lines):
        self.walls = []
        for row, line in enumerate(lines):
            for col, char in enumerate(line):
                if char == "#":
                    self.walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))


room = Room(MAP)

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

    for row in range(10):
        for col in range(14):
            screen.blit(floor_img, (col * TILE, row * TILE))
    for wall in room.walls:
        screen.blit(wall_img, wall)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Projeler bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground