Menu
CoddyTech

المشي

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

تُظهر pygame.key.get_pressed() المفاتيح المضغوطة حاليًا. اقرأها في كل إطار، وسيمشي الفارس ما دام أحد مفاتيح الأسهم مضغوطًا، من دون انتظار تكرار ضغط المفتاح.

أضف إلى الفارس speed وطريقة move، لكي تبقى قواعد مشيه مرتبطة بالفارس:

def move(self, keys):
    if keys[pygame.K_LEFT]:
        self.rect.x -= self.speed
    if keys[pygame.K_RIGHT]:
        self.rect.x += self.speed
    self.rect.clamp_ip(courtyard)

استخدم أربع عبارات if منفصلة، لا elif: عند الضغط على مفتاحي الأعلى واليمين معًا، يمشي الفارس قطريًا.

تعيد clamp_ip كائن Rect إلى داخل كائن Rect آخر إذا خرج منه، لذلك يتوقف الفارس عند الجدران. يشير _ip إلى أن التغيير يتم في مكانه: فهي تغيّر self.rect نفسه بدلًا من إرجاع كائن Rect جديد.

challenge icon

التحدي

سهل
  1. في Knight.__init__ اضبط self.speed = 3.
  2. اكتب move(self, keys): حرّك المستطيل باستخدام كل مفتاح من مفاتيح الأسهم بمقدار self.speed، ثم استدعِ self.rect.clamp_ip(courtyard).
  3. في حلقة اللعبة، استدعِ knight.move(pygame.key.get_pressed()) قبل الرسم.

جرّب بنفسك

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")
knight_img = load("knight.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))


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


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


knight = Knight()

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

    screen.blit(background, (0, 0))
    draw(knight.image, knight.rect.center)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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