الأقنعة
جزء من قسم الكائنات والصور في رحلة 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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الكائنات والصور
4الكائنات الرسومية والمجموعات
صنف Spriteالمجموعاتالإزالة باستخدام kill()الالتقاط باستخدام spritecollideمجموعة ضد مجموعة2دوّر واقلب وغيّر الحجم
التدوير حول المركزوجّهها في اتجاه الطيرانغيّر حجم الصورةدوّر انطلاقًا من الصورة الأصلية5تصادمات مثالية على مستوى البكسل
المستطيلات تبدو غير منصفةالأقنعةكائنات Sprite مثالية على مستوى البكسلمناطق التصادم الدائرية6التحريك باستخدام أوراق الرسوم المتحركة
قصّ ورقة الرسوم المتحركةعداد الإطاراتالتحريك باستخدام الوقتانفجار لمرة واحدةتدرّب بنفسك: Playground لـ Pygame