المشي
الدرس 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 جديد.
التحدي
سهل- في
Knight.__init__اضبطself.speed = 3. - اكتب
move(self, keys): حرّك المستطيل باستخدام كل مفتاح من مفاتيح الأسهم بمقدارself.speed، ثم استدعِself.rect.clamp_ip(courtyard). - في حلقة اللعبة، استدعِ
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