وصول الأعداء
جزء من قسم الكائنات والصور في رحلة 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. لاحقًا سيؤدي ذلك إلى خسارة حياة.
التحدي
متوسط- أضف
import random، وحمّلenemy_red.pngفيred_image، واكتبEnemyوspawn_wave. - أنشئ
enemies = pygame.sprite.Group()، ثم استدعِspawn_wave(red_image, 6, 2). - في كل إطار، حدّث الأعداء، وتخلّص من الذين تجاوزت قيمة
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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الكائنات والصور
4الكائنات الرسومية والمجموعات
صنف Spriteالمجموعاتالإزالة باستخدام kill()الالتقاط باستخدام spritecollideمجموعة ضد مجموعة7دورية النجوم
سفينة الدوريةأطلق أشعة الليزر2دوّر واقلب وغيّر الحجم
التدوير حول المركزوجّهها في اتجاه الطيرانغيّر حجم الصورةدوّر انطلاقًا من الصورة الأصلية5تصادمات مثالية على مستوى البكسل
المستطيلات تبدو غير منصفةالأقنعةكائنات Sprite مثالية على مستوى البكسلمناطق التصادم الدائرية6التحريك باستخدام أوراق الرسوم المتحركة
قصّ ورقة الرسوم المتحركةعداد الإطاراتالتحريك باستخدام الوقتانفجار لمرة واحدةتدرّب بنفسك: Playground لـ Pygame