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