פיצוצים
חלק מהיחידה ספרייטים ותמונות במסלול ה-Pygame של Coddy. שיעור 34 מתוך 36.
אויב שנעלם בפריים אחד גורם להרגשה כאילו לא קרה כלום. הציבו פיצוץ במקום שבו הוא היה: האנימציה החד־פעמית מפרק 6, כספרייט בקבוצה משלו.
for enemy in hits:
score += 10
explosions.add(Explosion(enemy.rect.center))לספרייט שחוסל עדיין יש Rect, ולכן enemy.rect.center הוא המקום שבו הוא נפגע. הפיצוץ מציג את explosion_1.png עד explosion_4.png, במשך 5 פריימים לכל תמונה, ואז מחסל את עצמו.
טענו את ארבע התמונות לרשימה, explosion_frames, לפני הלולאה. עדכנו את explosions בכל פריים וציירו אותה אחרונה, מעל כל השאר, כך שהפיצוץ יכסה את החללית ואת הלייזרים שהוא חופף להם.
צלילים, מסך רועד וניצוצות מעופפים מגיעים ביחידה 6, ונבנים על אותה לולאה.
אתגר
בינוני- טען את
explosion_1.pngעדexplosion_4.pngלתוך הרשימהexplosion_frames. - כתוב את המחלקה
Explosionמהשיעור פיצוץ חד־פעמי, שנוצר בעזרתcenter. - צור את
explosions = pygame.sprite.Group(); הוסף פיצוץ במרכז של כל אויב שהושמד; עדכן אותו בכל פריים וצייר אותו אחרי החללית.
נסו בעצמכם
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()
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
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
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
screen.fill((12, 14, 30))
enemies.draw(screen)
lasers.draw(screen)
screen.blit(player.image, player.rect)
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()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ספרייטים ותמונות
5התנגשויות מדויקות ברמת הפיקסל
מלבנים מרגישים לא הוגניםמסכותספרייטים מדויקים ברמת הפיקסלתיבות פגיעה מעגליות3מחלקות לאובייקטים במשחק
המחלקה הראשונה שלךמתודותself הוא האובייקטרשימה של אובייקטיםאובייקטים עם תמונותתת־מחלקהתרגלו בעצמכם: Pygame אונליין