الصندوق يخفي الجوهرة
جزء من قسم حلقة اللعبة في رحلة Pygame على Coddy. الدرس 18 من 35.
يُرسَم الصندوق قبل الجوهرة، لذلك تظهر الجوهرة فوقه. لكي يتمكن الصندوق من إخفاء الجوهرة تحته، ارسم الصندوق بعد الجوهرة: ما يُرسَم أخيرًا يغطي ما رُسِم قبله.
لذلك يجب ألا يصل الضغط على الصندوق إلى اختبار الجوهرة ويلتقط جوهرة لا يستطيع اللاعب رؤيتها. يُنفَّذ اختبارا if كلاهما. أما مع elif، فلا يُنفَّذ الاختبار الثاني إلا إذا كان الأول خاطئًا، لذا لا يستجيب للضغط إلا أحدهما:
if crate.collidepoint(event.pos):
dragging = True
elif gem.collidepoint(event.pos):
print("Got it!")اختبر أولًا ما رُسِم في الأعلى. عندئذٍ لا يصل الضغط على الصندوق أبدًا إلى الجوهرة التي تحته.
تجعل الحافة الداكنة الصندوق يبدو صلبًا. ارسم Rect نفسه مرة أخرى بلون أغمق وبعرض محدد، فيُرسَم حدّه الخارجي فقط فوق التعبئة.
التحدي
سهلاجعل الصندوق يُخفي الجوهرة، وامنع الضغط عليه من التقاط الجوهرة.
- انقل سطر رسم الصندوق إلى ما بعد مخطط الجوهرة، وارسم أسفله
crateمجددًا باللون(110, 70, 35)وبعرض3ليكون حافته. - في فرع
MOUSEBUTTONDOWN، غيّرifالخاص بالجوهرة إلىelif، أسفل اختبار الصندوق.
اضغط «العب»، واسحب الصندوق فوق الجوهرة ثم انقر عليها: ستظل الجوهرة مخفية ولن تظهر علامة وردية. ثم اضغط «تحقق».
جرّب بنفسك
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Hunt")
clock = pygame.time.Clock()
gem = pygame.Rect(225, 165, 30, 30)
crate = pygame.Rect(40, 230, 60, 60)
dragging = False
score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if crate.collidepoint(event.pos):
dragging = True
if gem.collidepoint(event.pos):
score += 1
gem.x = random.randint(15, 435)
gem.y = random.randint(55, 315)
elif event.type == pygame.MOUSEBUTTONUP:
dragging = False
elif event.type == pygame.MOUSEMOTION and dragging:
crate.move_ip(event.rel)
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (150, 100, 50), crate)
gem_points = [gem.midtop, gem.midright, gem.midbottom, gem.midleft]
pygame.draw.polygon(screen, (80, 220, 255), gem_points)
if gem.collidepoint(pygame.mouse.get_pos()):
pygame.draw.rect(screen, (255, 196, 0), gem.inflate(10, 10), 2)
for i in range(score):
pygame.draw.rect(screen, (240, 110, 180), (10 + 10 * i, 14, 8, 8))
mouse_x, mouse_y = pygame.mouse.get_pos()
pygame.draw.circle(screen, (240, 240, 240), (mouse_x, mouse_y), 10, 2)
pygame.display.flip()
clock.tick(60)
pygame.quit()
جميع دروس حلقة اللعبة
تدرّب بنفسك: Playground لـ Pygame