Menu
CoddyTech

الفارس

جزء من قسم المشاريع في رحلة 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 rect

cell_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
challenge icon

التحدي

متوسط

ضع الفارس في الغرفة الأولى، واقفًا على P.

  1. أضف الدالتين draw وcell_rect أعلاه.
  2. في Room، عيّن self.start = (72, 72)؛ وعند وجود P، عيّن self.start = cell_rect(col, row).center.
  3. اكتب الصنف Knight أعلاه، واجعل knight = Knight(room.start) بعد الغرفة.
  4. بعد الجدران، استدعِ 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