מסכות
חלק מהיחידה ספרייטים ותמונות במסלול ה-Pygame של Coddy. שיעור 22 מתוך 36.
מסכה היא רשת של כן ולא, ערך אחד לכל פיקסל: כן במקום שבו התמונה אטומה, ולא במקום שבו היא שקופה. pygame יוצרת אחת מכל תמונה עם אלפא:
ship_mask = pygame.mask.from_surface(ship)
ball_mask = pygame.mask.from_surface(ball)יוצרים את המסכות פעם אחת, לפני הלולאה, כמו התמונות שמהן הן נוצרות.
שתי מסכות חופפות כשפיקסל אטום של אחת נמצא על פיקסל אטום של השנייה. למסכה אין מיקום, לכן מציינים היכן השנייה נמצאת ביחס לראשונה: ההיסט, כלומר הפינה השמאלית העליונה של השנייה פחות הפינה השמאלית העליונה של זו.
offset = (ball_rect.x - ship_rect.x, ball_rect.y - ship_rect.y)
if ship_mask.overlap(ball_mask, offset):overlap מחזירה את הנקודה הראשונה שבה הן נוגעות, או None אם הן אינן נוגעות, ולכן היא מתאימה לבדיקה בתוך if. אם מחשבים את ההיסט בכיוון ההפוך, הכדור נבדק כאילו הוא נמצא בצד השני של החללית.
עכשיו המתאר האדום דורש מגע ממשי: הפינות לבדן נשארות אפורות.
אתגר
בינוני- לפני הלולאה, צור את
ship_maskואתball_maskבאמצעותpygame.mask.from_surface. - צבע את קו המתאר באדום כאשר
ship_mask.overlap(ball_mask, offset)מוצא נקודה, עם ההיסט מ־ship_rectאלball_rect; אחרת, צבע אותו באפור.
נסו בעצמכם
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Near Miss")
clock = pygame.time.Clock()
ship = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship.get_rect(topleft=(420, 320))
ball = pygame.image.load("assets/images/spike_ball.png").convert_alpha()
ball_rect = ball.get_rect(center=(320, 240))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
ship_rect.x -= 4
if keys[pygame.K_RIGHT]:
ship_rect.x += 4
if keys[pygame.K_UP]:
ship_rect.y -= 4
if keys[pygame.K_DOWN]:
ship_rect.y += 4
screen.fill((20, 22, 40))
screen.blit(ball, ball_rect)
screen.blit(ship, ship_rect)
if ship_rect.colliderect(ball_rect):
colour = (230, 60, 60)
else:
colour = (90, 90, 120)
pygame.draw.rect(screen, colour, ball_rect, 2)
pygame.display.flip()
clock.tick(60)
pygame.quit()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ספרייטים ותמונות
5התנגשויות מדויקות ברמת הפיקסל
מלבנים מרגישים לא הוגניםמסכותספרייטים מדויקים ברמת הפיקסלתיבות פגיעה מעגליות3מחלקות לאובייקטים במשחק
המחלקה הראשונה שלךמתודותself הוא האובייקטרשימה של אובייקטיםאובייקטים עם תמונותתת־מחלקהתרגלו בעצמכם: Pygame אונליין