Menu
CoddyTech

האויבים מגיעים

חלק מהיחידה ספרייטים ותמונות במסלול ה-Pygame של Coddy. שיעור 32 מתוך 36.

עכשיו האויבים. ספרייט של Enemy מקבל את התמונה ואת המהירות שלו בעת יצירתו, כך שמחלקה אחת יכולה לצייר כל סוג:

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. בהמשך זה יעלה בחיים.

challenge icon

אתגר

בינוני
  1. הוסף import random, טען את enemy_red.png לתוך red_image, וכתוב את Enemy ואת spawn_wave.
  2. צור את enemies = pygame.sprite.Group(), ואז קרא ל־spawn_wave(red_image, 6, 2).
  3. בכל פריים, עדכן את האויבים, הסר את אלה שה־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()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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

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