أصب وأحرز النقاط
جزء من قسم الكائنات والصور في رحلة Pygame على Coddy. الدرس 33 من 36.
الليزر ضد الأعداء هو مجموعة في مواجهة مجموعة، باستخدام groupcollide. صورة الليزر عبارة عن شعاع رفيع في منتصف مربع مساحته 48 بكسلًا، لذا فإن اختبار Rect سيسمح لليزر الموجود على بُعد 20 بكسلًا إلى الجانب بتدمير عدو. اختبر الصور باستخدام الأقنعة:
hits = pygame.sprite.groupcollide(enemies, lasers, True, True, pygame.sprite.collide_mask)
for enemy in hits:
score += 10الوسيطة الخامسة هي الاختبار، كما في spritecollide. أنشئ لكل من Laser وEnemy خاصية self.mask = pygame.mask.from_surface(self.image)، لكي تُنشأ الأقنعة مرة واحدة، لا عند كل اختبار.
يؤدي التكرار عبر hits إلى المرور على الأعداء المدمَّرين، واحدًا تلو الآخر: قيمة كل منهم 10 نقاط. اعرض النتيجة في أعلى اليسار باستخدام font = pygame.font.Font(None, 32)، وأنشئها مرة واحدة قبل الحلقة.
التحدي
متوسط- أضف
self.maskإلىLaserوEnemy. - اجعل
score = 0وأنشئ خطًا بحجم 32 قبل الحلقة. - بعد التحديثات، اكتشف التصادم بين
enemiesوlasersباستخدامpygame.sprite.collide_mask، واحذف كليهما، وأضف 10 إلىscoreلكل عدو يُصاب. - اعرض
Score:والنتيجة عند(10, 10)، باللون(240, 240, 240).
جرّب بنفسك
import random
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()
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))
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.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
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()
screen.fill((12, 14, 30))
enemies.draw(screen)
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