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 rectcell_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 = centerTantangan
SedangTempatkan kesatria di ruang pertama, berdiri di atas P.
- Tambahkan fungsi
drawdancell_rectdi atas. - Di
Room, tetapkanself.start = (72, 72); saat menemukanP, tetapkanself.start = cell_rect(col, row).center. - Tulis class
Knightdi atas, lalu buatknight = Knight(room.start)setelah ruang tersebut. - 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