Menu
CoddyTech

العقبات

جزء من قسم قواعد اللعبة في رحلة Pygame على Coddy. الدرس 26 من 29.

والآن نضيف شيئًا للقفز فوقه. العائق هو كائن رسومي يبدأ بعد الحافة اليمنى بقليل، على الأرض، ويتحرك إلى اليسار:

class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = random.choice(obstacle_images)
        self.rect = self.image.get_rect(midbottom=(664, GROUND_Y))

    def update(self):
        self.rect.x -= speed
        if self.rect.right < 0:
            self.kill()

تحتوي obstacle_images على كرة الأشواك والكتلة، وقد حُمّلتا مرة واحدة، لذا يختار كل عائق صورة من دون قراءة ملف. تُخرج kill() الكائن الرسومي من كل مجموعة ينتمي إليها، لذا تُحذف العوائق التي تغادر من اليسار.

أبقِها في مجموعة: تحرّك obstacles.update() كل العوائق، وترسمها obstacles.draw(screen) كلها. ويضيفها مؤقّت. في كل مرة يعمل فيها، أعد تشغيله بفاصل عشوائي، حتى لا يتمكن اللاعب من القفز على إيقاع منتظم:

if event.type == SPAWN:
    obstacles.add(Obstacle())
    pygame.time.set_timer(SPAWN, random.randint(1000, 2000))

لا يستطيع العدّاء الاصطدام بها بعد. سنتناول ذلك لاحقًا.

challenge icon

التحدي

متوسط
  1. أضف SPAWN = pygame.USEREVENT + 1 وspeed = 6 وقائمة obstacle_images التي تحتوي على spike_ball.png وblob.png.
  2. اكتب الكائن الرسومي Obstacle كما هو موضّح.
  3. أنشئ مجموعة باسم obstacles وابدأ مؤقّت SPAWN عند 1500 مللي ثانية.
  4. عند حدوث SPAWN، أضف عائقًا وأعِد تشغيل المؤقّت باستخدام random.randint(1000, 2000).
  5. حدّث المجموعة وارسمها في كل إطار.

جرّب بنفسك

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()

SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1


class Runner(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.frames = [
            pygame.image.load("assets/images/player.png").convert_alpha(),
            pygame.image.load("assets/images/player_walk.png").convert_alpha(),
        ]
        self.image = self.frames[0]
        self.step = 0
        self.rect = self.image.get_rect(midbottom=(100, GROUND_Y))
        self.vy = 0

    def jump(self):
        if self.rect.bottom == GROUND_Y:
            self.vy = -16

    def update(self):
        self.vy += GRAVITY
        self.rect.y += self.vy
        if self.rect.bottom >= GROUND_Y:
            self.rect.bottom = GROUND_Y
            self.vy = 0
        if self.rect.bottom == GROUND_Y:
            self.step += 1
            self.image = self.frames[self.step // 8 % 2]
        else:
            self.image = self.frames[1]


runner = Runner()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
            runner.jump()

    runner.update()

    screen.fill(SKY)
    pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
    screen.blit(runner.image, runner.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس قواعد اللعبة

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