Şövalye Yürüyor
Coddy'nin Pygame Journey'sinin Projeler bölümünün bir parçası. Ders 22 / 31.
Şövalye haritanın P karesinde başlar ve ok tuşlarıyla kare başına 3 piksel ilerler.
Resmi tam bir karo boyutundadır: 48'e 48 piksel. Duvarlar arasındaki boşluklar da aynı boyuttadır. 48 piksel boyutunda bir Rect, boşluğa yalnızca tam piksel hizasında sığar. Bu yüzden şövalyenin Rect'i resminden küçüktür, 32'ye 32 piksel boyutundadır ve resim bunun ortasına çizilir. Çarpışan Rect'tir; gördüğün ise resimdir.
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 rectDuvarlar, Moss Caves'teki platformlarda olduğu gibi onu durdurur: x boyunca hareket et, üst üste geldiği duvarlardan dışarı it, ardından aynı işlemi y boyunca yap. Her seferinde tek bir eksende hareket etmek, hangi taraftan çarptığını anlamanı sağlar.
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
# ardından bottom ve top ile dy için de aynısını yapGörev
Zor- Yukarıya
drawvecell_rectişlevlerini ekleyin. Roomiçinde, döngüden önceself.start = (72, 72)ayarlayın ve birPiçinself.start = cell_rect(col, row).centerayarlayın.class Knight(pygame.sprite.Sprite)yazın:__init__(self, center)yöntemiself.image = knight_imgvecenterüzerinde ortalanmış 32'ye 32 boyutlarında birself.rectayarlar. Yukarıdakimove(dx, dy, blocks)yöntemini y bölümüyle birlikte ekleyin.- Oda tanımlandıktan sonra
knight = Knight(room.start)oluşturun. - Her karede, Sol tuşuyla
dxdeğerini -3, Sağ tuşuyla 3 olarak ayarlayın; Yukarı tuşuyladydeğerini -3, Aşağı tuşuyla 3 olarak ayarlayın (aksi hâlde 0), ardındanknight.move(dx, dy, room.walls)çağrısını yapın. - Şövalyeyi duvarlardan sonra çizin:
draw(knight.image, knight.rect).
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 = []
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()
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Projeler bölümündeki tüm dersler
Kendi başına pratik yap: Pygame playground