Menu
CoddyTech

Şövalye

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

Şövalye haritadaki P üzerinde başlar.

Resmi tam bir karo boyutundadır: 48'e 48; duvarlar arasındaki boşluklar da öyledir. 48 piksellik bir Rect, boşluğa yalnızca tam piksele hizalandığında sığar. Bu yüzden şövalyenin Rect'i resminden daha küçüktür, 32'ye 32 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

cell_rect(col, row), bir karonun ortasındaki 32'ye 32 boyutlu Rect'tir. Şövalye de Sky Runner'daki koşucu gibi bir sprite'tır; bir noktada oluşturulur:

class Knight(pygame.sprite.Sprite):
    def __init__(self, center):
        super().__init__()
        self.image = knight_img
        self.rect = pygame.Rect(0, 0, 32, 32)
        self.rect.center = center
challenge icon

Görev

Orta

Şövalyeyi ilk odaya, P'nin üzerine yerleştir.

  1. draw ve cell_rect işlevlerini yukarıya ekle.
  2. Room içinde self.start = (72, 72) olarak ayarla; bir P, self.start = cell_rect(col, row).center değerini ayarlar.
  3. Yukarıdaki Knight sınıfını yaz ve odadan sonra knight = Knight(room.start) oluştur.
  4. Duvarlardan sonra draw(knight.image, knight.rect) çağrısını yap.

“Oyna” düğmesine bas: şövalye P'nin üzerinde durur. Ardından “Kontrol et” düğmesine bas.

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()

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

Kendi başına pratik yap: Pygame playground