Menu
CoddyTech

Kesatria

Termasuk bagian Proyek dalam perjalanan Pygame di Coddy. Pelajaran 23 dari 33.

Ksatria mulai di P pada peta.

Gambarnya memenuhi satu petak, berukuran 48 kali 48, begitu juga celah di antara dinding. Rect berukuran 48 piksel hanya akan pas di celah jika sejajar dengan piksel yang tepat. Jadi, Rect ksatria lebih kecil daripada gambarnya, berukuran 32 kali 32, dan gambar ditampilkan tepat di tengahnya. Rect adalah bagian yang bertabrakan, sedangkan gambar adalah bagian yang kamu lihat.

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) adalah Rect berukuran 32 kali 32 di tengah petak. Ksatria adalah sprite, seperti pelari di Sky Runner, yang dibuat pada suatu titik:

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

Tantangan

Sedang

Tempatkan kesatria di ruang pertama, berdiri di atas P.

  1. Tambahkan fungsi draw dan cell_rect di atas.
  2. Di Room, tetapkan self.start = (72, 72); saat menemukan P, tetapkan self.start = cell_rect(col, row).center.
  3. Tulis class Knight di atas, lalu buat knight = Knight(room.start) setelah ruang tersebut.
  4. Setelah dinding, panggil draw(knight.image, knight.rect).

Tekan tombol “Main”: kesatria berdiri di atas P. Lalu tekan tombol “Periksa”.

Coba sendiri

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

Semua pelajaran di Proyek

Latihan sendiri: Playground Pygame