Menu
CoddyTech

Hisarın İlk Odası

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

Sıradaki oyunun Rune Keep: üç odalı bir hisarda kapana kısılmış, yukarıdan görünen bir şövalye. Her odada bir anahtar, kilitli bir kapı ve canavarlar var. Anahtarı bul, kapıyı aç, sonraki odaya ulaş ve kalplerini koruyarak dışarı çık.

Bir oda, Moss Caves'teki gibi bir metin haritasıdır: 48 piksellik karelerden oluşan 14 sütun ve 10 satır; bu da 672'ye 480 piksellik bir pencereyi doldurur. # bir duvardır. Diğer harfler sonraki derslerde canlanacak: P şövalye, K anahtar, D kapı, S bir sümük canavarı, H bir iksir. Şimdilik bunlar zemindir.

Room sınıfı, haritasından bir odanın barındırdığı her şeyi oluşturur. Daha sonra şövalye odadan odaya yürür ve her yeni oda tek satırla oluşturulur: Room(MAP2).

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

Bir duvarı çizmek için görselini Rect konumuna yerleştir: screen.blit(wall_img, wall), görseli Rect'in sol üst köşesine yerleştirir.

challenge icon

Görev

Kolay

Başlangıç kodu pencereyi açar, zemini karolarla kaplar ve kalenin ihtiyaç duyduğu yazı tipini ve tüm görselleri yükler; sonraki dersler için hazırdır: knight_img, key_img, slime_img ve diğerleri.

  1. Room.__init__ içinde lines üzerinde ilerleyin ve her # için self.walls listesine (col * TILE, row * TILE) konumunda 48'e 48 boyutlarında bir Rect ekleyin. Başlangıç kodu zaten room = Room(MAP) oluşturuyor.
  2. Zemini çizdikten sonra, room.walls içindeki her Rect konumunda wall_img görselini blit edin.

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 = []
        # duvarları burada oluştur


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))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

Kendi başına pratik yap: Pygame playground