Menu
CoddyTech

الفارس

الدرس 2 من 20 في دورة مشروع Pygame: الصمود في القلعة على Coddy.

الفارس كائن رسومي: فئة مبنية على pygame.sprite.Sprite تحتفظ بصورته في self.image وموقعه في self.rect.

class Knight(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = knight_img
        self.rect = pygame.Rect(0, 0, 24, 24)
        self.rect.center = courtyard.center

الصورة مربعة، طول ضلعها 48 بكسل، لكن أبعاد Rect هي 24 فقط. سيصطدم الوحوش بـ Rect، لذا يجب أن يصل الوحش إلى جسد الفارس، لا إلى زاوية من المساحة الفارغة المحيطة به. يمنح مربع التصادم الصغير اللاعب شعورًا بالإنصاف.

بما أن أبعاد الصورة وRect مختلفة، ارسم الصورة بحيث يكون مركزها مطابقًا لمركز Rect. تعطي image.get_rect(center=point) كائن Rect بأبعاد الصورة، متمركزًا عند نقطة، وتقبل blit هذا الكائن بوصفه موضع الرسم:

def draw(image, center):
    screen.blit(image, image.get_rect(center=center))
challenge icon

التحدي

سهل
  1. حمّل صورة الفارس: knight_img = load("knight.png").
  2. اكتب الصنف Knight أعلاه: الصورة knight_img، ومستطيل rect أبعاده 24 في 24 ومتمركز عند courtyard.center.
  3. اكتب الدالة draw(image, center).
  4. قبل الحلقة، أنشئ knight = Knight()، وبعد رسم الخلفية ارسمه باستخدام draw(knight.image, knight.rect.center).

جرّب بنفسك

import pygame

WIDTH, HEIGHT = 720, 480
TILE = 48

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Hold the Keep")
clock = pygame.time.Clock()


def load(name):
    return pygame.image.load("assets/images/" + name).convert_alpha()


floor_img = load("floor.png")
wall_img = load("wall.png")

courtyard = pygame.Rect(TILE, TILE, WIDTH - 2 * TILE, HEIGHT - 2 * TILE)
background = pygame.Surface((WIDTH, HEIGHT))
for row in range(HEIGHT // TILE):
    for col in range(WIDTH // TILE):
        x = col * TILE
        y = row * TILE
        if courtyard.collidepoint(x, y):
            background.blit(floor_img, (x, y))
        else:
            background.blit(wall_img, (x, y))



running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.blit(background, (0, 0))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

جميع دروس مشروع Pygame: الصمود في القلعة

تدرّب بنفسك: Playground لـ Pygame