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. הוסף ל־Laser ול־Enemy את self.mask.
  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()

כל השיעורים ביחידה ספרייטים ותמונות

תרגלו בעצמכם: Pygame אונליין