الفارس
جزء من قسم المشاريع في رحلة Pygame على Coddy. الدرس 23 من 33.
يبدأ الفارس عند P على الخريطة.
صورته بحجم بلاطة كاملة، 48 في 48، وكذلك الفجوات بين الجدران. لن يتسع مستطيل Rect بحجم 48 بكسل في فجوة إلا إذا اصطفّ مع البكسل بدقة. لذا فإن مستطيل Rect الخاص بالفارس أصغر من صورته، 32 في 32، وتُرسم الصورة في وسطه. المستطيل Rect هو ما يصطدم؛ أما الصورة فهي ما تراه.
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) هو مستطيل Rect بحجم 32 في 32 في منتصف البلاطة. الفارس هو كائن sprite، مثل عدّاء Sky Runner، يُنشأ عند نقطة:
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التحدي
متوسطضع الفارس في الغرفة الأولى، واقفًا على P.
- أضف الدالتين
drawوcell_rectأعلاه. - في
Room، عيّنself.start = (72, 72)؛ وعند وجودP، عيّنself.start = cell_rect(col, row).center. - اكتب الصنف
Knightأعلاه، واجعلknight = Knight(room.start)بعد الغرفة. - بعد الجدران، استدعِ
draw(knight.image, knight.rect).
اضغط «العب»: سيقف الفارس على P. ثم اضغط «تحقق».
جرّب بنفسك
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()
جميع دروس المشاريع
تدرّب بنفسك: Playground لـ Pygame