Menu
CoddyTech

מסכות

חלק מהיחידה ספרייטים ותמונות במסלול ה-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. אם מחשבים את ההיסט בכיוון ההפוך, הכדור נבדק כאילו הוא נמצא בצד השני של החללית.

עכשיו המתאר האדום דורש מגע ממשי: הפינות לבדן נשארות אפורות.

challenge icon

אתגר

בינוני
  1. לפני הלולאה, צור את ship_mask ואת ball_mask באמצעות pygame.mask.from_surface.
  2. צבע את קו המתאר באדום כאשר 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()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה ספרייטים ותמונות

תרגלו בעצמכם: Pygame אונליין