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 rectDinding 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 topTantangan
Sulit- Tambahkan fungsi
drawdancell_rectdi atas. - Di dalam
Room, aturself.start = (72, 72)sebelum perulangan, dan untukP, aturself.start = cell_rect(col, row).center. - Tulis
class Knight(pygame.sprite.Sprite):__init__(self, center)-nya mengaturself.image = knight_imgdanself.rectberukuran 32 kali 32 yang dipusatkan padacenter. Berikan methodmove(dx, dy, blocks)di atas, beserta bagian y-nya. - Buat
knight = Knight(room.start)setelah room. - Setiap frame, atur
dxke -3 saat tombol Left ditekan atau 3 saat tombol Right ditekan, lalu aturdyke -3 saat tombol Up ditekan atau 3 saat tombol Down ditekan (0 jika tidak), kemudian panggilknight.move(dx, dy, room.walls). - 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()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Proyek
Latihan sendiri: Playground Pygame