שלושה חיים
חלק מהיחידה ספרייטים ותמונות במסלול ה-Pygame של Coddy. שיעור 35 מתוך 36.
כעת אפשר להפסיד במשחק. לספינה יש שלושה חיים. אויב גורע חיים אחד כשהוא עובר את הקצה התחתון, ועוד אחד כשהוא מתנגש בספינה:
crashes = pygame.sprite.spritecollide(player, enemies, True, pygame.sprite.collide_mask)
for enemy in crashes:
lives -= 1
explosions.add(Explosion(enemy.rect.center))גם לספינה דרוש self.mask. בלולאה שמחסלת אויבים שעוברים את הקצה התחתון, גרעו גם חיים.
כש-lives מגיע ל-0, המשחק נעצר: העבירו את כל חלק העדכון, מ-player.update() ועד ההתנגשויות, אל מתחת ל-if lives > 0:, והציגו את Game over באמצע. השאירו את explosions.update() מחוץ לו, כדי שהפיצוץ האחרון ימשיך עד סופו.
שני אויבים יכולים לקחת את שני החיים האחרונים באותה תמונה, ולהשאיר את lives על -1. הציגו את max(lives, 0), כלומר את הגדול מבין שני המספרים, כדי שהמונה לעולם לא יראה ערך קטן מ-0.
אתגר
בינוני- הגדירו
lives = 3והוסיפו ל-Playerאתself.mask. - אויב שעובר את הקצה התחתון גורם לאובדן חיים. אויב שנוגע בחללית, בבדיקה באמצעות
collide_mask, מושמד, גורם לאובדן חיים ומתפוצץ. - הכניסו את חלק העדכון תחת
if lives > 0:. - ציירו את
Lives:ואתmax(lives, 0)כך שהפינה הימנית העליונה שלהם תהיה ב-(630, 10), ואתGame overבמרכז(320, 240)ברגע ש-lives <= 0.
נסו בעצמכם
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
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()
explosion_frames = []
for number in range(1, 5):
explosion_frames.append(pygame.image.load(f"assets/images/explosion_{number}.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))
self.mask = pygame.mask.from_surface(self.image)
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.mask = pygame.mask.from_surface(self.image)
self.speed = speed
def update(self):
self.rect.y += self.speed
class Explosion(pygame.sprite.Sprite):
def __init__(self, center):
super().__init__()
self.index = 0
self.timer = 0
self.image = explosion_frames[0]
self.rect = self.image.get_rect(center=center)
def update(self):
self.timer += 1
if self.timer == 5:
self.timer = 0
self.index += 1
if self.index == len(explosion_frames):
self.kill()
else:
self.image = explosion_frames[self.index]
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()
explosions = pygame.sprite.Group()
last_shot = 0
score = 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()
hits = pygame.sprite.groupcollide(enemies, lasers, True, True, pygame.sprite.collide_mask)
for enemy in hits:
score += 10
explosions.add(Explosion(enemy.rect.center))
explosions.update()
screen.fill((12, 14, 30))
enemies.draw(screen)
lasers.draw(screen)
screen.blit(player.image, player.rect)
explosions.draw(screen)
score_text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(score_text, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
כל השיעורים ביחידה ספרייטים ותמונות
7סיור כוכבים
ספינת הסיורירי בלייזרים5התנגשויות מדויקות ברמת הפיקסל
מלבנים מרגישים לא הוגניםמסכותספרייטים מדויקים ברמת הפיקסלתיבות פגיעה מעגליות3מחלקות לאובייקטים במשחק
המחלקה הראשונה שלךמתודותself הוא האובייקטרשימה של אובייקטיםאובייקטים עם תמונותתת־מחלקהתרגלו בעצמכם: Pygame אונליין