פגיעה וניקוד
חלק מהיחידה ספרייטים ותמונות במסלול ה-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), שייווצר פעם אחת לפני הלולאה.
אתגר
בינוני- הוסף ל־
Laserול־Enemyאתself.mask. - הגדר
score = 0וצור גופן בגודל 32 לפני הלולאה. - אחרי העדכונים, בדוק התנגשויות בין
enemiesל־lasersבאמצעותpygame.sprite.collide_mask, הסר את שניהם, והוסף 10 ל־scoreעבור כל אויב שנפגע. - צייר את
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()
כל השיעורים ביחידה ספרייטים ותמונות
7סיור כוכבים
ספינת הסיורירי בלייזרים5התנגשויות מדויקות ברמת הפיקסל
מלבנים מרגישים לא הוגניםמסכותספרייטים מדויקים ברמת הפיקסלתיבות פגיעה מעגליות3מחלקות לאובייקטים במשחק
המחלקה הראשונה שלךמתודותself הוא האובייקטרשימה של אובייקטיםאובייקטים עם תמונותתת־מחלקהתרגלו בעצמכם: Pygame אונליין