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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الكائنات والصور

تدرّب بنفسك: Playground لـ Pygame