Menu
CoddyTech

أصب وأحرز النقاط

جزء من قسم الكائنات والصور في رحلة 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)، وأنشئها مرة واحدة قبل الحلقة.

challenge icon

التحدي

متوسط
  1. أضف self.mask إلى Laser وEnemy.
  2. اجعل score = 0 وأنشئ خطًا بحجم 32 قبل الحلقة.
  3. بعد التحديثات، اكتشف التصادم بين enemies وlasers باستخدام pygame.sprite.collide_mask، واحذف كليهما، وأضف 10 إلى score لكل عدو يُصاب.
  4. اعرض 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()

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

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