Menu
CoddyTech

وصول الأعداء

جزء من قسم الكائنات والصور في رحلة Pygame على Coddy. الدرس 32 من 36.

والآن الأعداء. يحصل كائن العدو على صورته وسرعته عند إنشائه، لذا يمكن لصنف واحد رسم كل نوع:

class Enemy(pygame.sprite.Sprite):
    def __init__(self, image, x, y, speed):
        super().__init__()
        self.image = image
        self.rect = self.image.get_rect(center=(x, y))
        self.speed = speed

    def update(self):
        self.rect.y += self.speed

الموجة هي مجموعة من الأعداء مصطفّين فوق النافذة كي يظهروا واحدًا تلو الآخر، بحيث يكون كل منهم أعلى من السابق بـ 120 بكسل، عند قيمة x عشوائية:

def spawn_wave(image, count, speed):
    for i in range(count):
        x = random.randint(40, 600)
        enemies.add(Enemy(image, x, -40 - i * 120, speed))

يكون الأول في المنتصف عند y = -40، والثاني عند -160، وهكذا: جميعهم خارج مجال الرؤية في البداية. تُبقي دالة الموجة في مكان واحد؛ ويستدعيها الدرس السابق لكل موجة.

يجب إزالة العدو الذي يسقط متجاوزًا أسفل النافذة. في الحلقة الرئيسية، بعد enemies.update()، أزل أي عدو يتجاوز أعلاه 480. لاحقًا سيؤدي ذلك إلى خسارة حياة.

challenge icon

التحدي

متوسط
  1. أضف import random، وحمّل enemy_red.png في red_image، واكتب Enemy وspawn_wave.
  2. أنشئ enemies = pygame.sprite.Group()، ثم استدعِ spawn_wave(red_image, 6, 2).
  3. في كل إطار، حدّث الأعداء، وتخلّص من الذين تجاوزت قيمة rect.top لديهم 480، وارسمهم قبل أشعة الليزر.

جرّب بنفسك

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = ship_image
        self.rect = self.image.get_rect(midbottom=(320, 470))

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 6
        if keys[pygame.K_RIGHT]:
            self.rect.x += 6
        self.rect.clamp_ip(screen.get_rect())


class Laser(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = laser_image
        self.rect = self.image.get_rect(midbottom=(x, y))

    def update(self):
        self.rect.y -= 10
        if self.rect.bottom < 0:
            self.kill()


player = Player()
lasers = pygame.sprite.Group()
last_shot = 0

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

    player.update()
    keys = pygame.key.get_pressed()
    now = pygame.time.get_ticks()
    if keys[pygame.K_SPACE] and now - last_shot >= 250:
        lasers.add(Laser(player.rect.centerx, player.rect.top))
        last_shot = now
    lasers.update()

    screen.fill((12, 14, 30))
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    pygame.display.flip()
    clock.tick(60)

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

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

جميع دروس الكائنات والصور

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