الانفجارات
جزء من قسم الكائنات والصور في رحلة Pygame على Coddy. الدرس 34 من 36.
العدو الذي يختفي في إطار واحد يوحي بأن شيئًا لم يحدث. ضع انفجارًا في مكانه: الرسوم المتحركة ذات التشغيل الواحد من الفصل 6، على هيئة كائن رسومي ضمن مجموعته الخاصة.
for enemy in hits:
score += 10
explosions.add(Explosion(enemy.rect.center))لا يزال للكائن الرسومي الذي قُتل مستطيله، لذا فإن enemy.rect.center هو موضع إصابته. يعرض الانفجار explosion_1.png إلى explosion_4.png، بمعدل 5 إطارات لكل صورة، ثم يزيل نفسه.
حمّل الصور الأربع في قائمة، explosion_frames، قبل الحلقة. حدّث explosions في كل إطار وارسمها أخيرًا، فوق كل شيء آخر، لكي يغطي الانفجار السفينة والليزرات التي يتداخل معها.
تأتي الأصوات واهتزاز الشاشة والشرارات المتطايرة في القسم 6، مبنيةً على الحلقة نفسها.
التحدي
متوسط- حمّل
explosion_1.pngإلىexplosion_4.pngفي القائمةexplosion_frames. - اكتب الفئة
Explosionمن درس «انفجار لمرة واحدة»، باستخدامcenter. - أنشئ
explosions = pygame.sprite.Group()؛ وأضف انفجارًا عند مركز كل عدو مدمّر؛ وحدّثه في كل إطار، وارسمه بعد السفينة.
جرّب بنفسك
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
red_image = pygame.image.load("assets/images/enemy_red.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))
self.mask = pygame.mask.from_surface(self.image)
def update(self):
self.rect.y -= 10
if self.rect.bottom < 0:
self.kill()
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.mask = pygame.mask.from_surface(self.image)
self.speed = speed
def update(self):
self.rect.y += self.speed
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))
player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
last_shot = 0
score = 0
spawn_wave(red_image, 6, 2)
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()
enemies.update()
for enemy in enemies:
if enemy.rect.top > 480:
enemy.kill()
hits = pygame.sprite.groupcollide(enemies, lasers, True, True, pygame.sprite.collide_mask)
for enemy in hits:
score += 10
screen.fill((12, 14, 30))
enemies.draw(screen)
lasers.draw(screen)
screen.blit(player.image, player.rect)
score_text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(score_text, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الكائنات والصور
4الكائنات الرسومية والمجموعات
صنف Spriteالمجموعاتالإزالة باستخدام kill()الالتقاط باستخدام spritecollideمجموعة ضد مجموعة2دوّر واقلب وغيّر الحجم
التدوير حول المركزوجّهها في اتجاه الطيرانغيّر حجم الصورةدوّر انطلاقًا من الصورة الأصلية5تصادمات مثالية على مستوى البكسل
المستطيلات تبدو غير منصفةالأقنعةكائنات Sprite مثالية على مستوى البكسلمناطق التصادم الدائرية6التحريك باستخدام أوراق الرسوم المتحركة
قصّ ورقة الرسوم المتحركةعداد الإطاراتالتحريك باستخدام الوقتانفجار لمرة واحدةتدرّب بنفسك: Playground لـ Pygame