Menu
CoddyTech

Kesatria Berjalan

Termasuk bagian Proyek dalam perjalanan Pygame di Coddy. Pelajaran 22 dari 31.

Ksatria mulai dari P pada peta dan berjalan dengan tombol panah, 3 piksel per frame.

Gambarnya berukuran satu tile penuh, 48 kali 48, begitu juga celah di antara dinding. Rect berukuran 48 piksel hanya akan muat di celah jika sejajar tepat hingga ke pikselnya. Jadi, Rect ksatria lebih kecil daripada gambarnya, yaitu 32 kali 32, dan gambarnya digambar tepat di tengah Rect tersebut. Rect-lah yang bertabrakan, sedangkan gambar adalah 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

Dinding menghentikannya seperti platform di Moss Caves: bergerak sepanjang sumbu x, dorong keluar dari dinding mana pun yang ditumpanginya, lalu lakukan hal yang sama pada sumbu y. Melakukannya satu sumbu pada satu waktu memberi tahu kamu sisi mana yang ditabraknya.

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
    # lalu lakukan hal yang sama untuk dy, dengan bottom dan top
challenge icon

Tantangan

Sulit
  1. Tambahkan fungsi draw dan cell_rect di atas.
  2. Di dalam Room, atur self.start = (72, 72) sebelum perulangan, dan untuk P, atur self.start = cell_rect(col, row).center.
  3. Tulis class Knight(pygame.sprite.Sprite): __init__(self, center)-nya mengatur self.image = knight_img dan self.rect berukuran 32 kali 32 yang dipusatkan pada center. Berikan method move(dx, dy, blocks) di atas, beserta bagian y-nya.
  4. Buat knight = Knight(room.start) setelah room.
  5. Setiap frame, atur dx ke -3 saat tombol Left ditekan atau 3 saat tombol Right ditekan, lalu atur dy ke -3 saat tombol Up ditekan atau 3 saat tombol Down ditekan (0 jika tidak), kemudian panggil knight.move(dx, dy, room.walls).
  6. Gambar knight setelah dinding: draw(knight.image, knight.rect).

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()
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Proyek

Latihan sendiri: Playground Pygame