Menu
CoddyTech

الصندوق يخفي الجوهرة

جزء من قسم حلقة اللعبة في رحلة Pygame على Coddy. الدرس 18 من 35.

يُرسَم الصندوق قبل الجوهرة، لذلك تظهر الجوهرة فوقه. لكي يتمكن الصندوق من إخفاء الجوهرة تحته، ارسم الصندوق بعد الجوهرة: ما يُرسَم أخيرًا يغطي ما رُسِم قبله.

لذلك يجب ألا يصل الضغط على الصندوق إلى اختبار الجوهرة ويلتقط جوهرة لا يستطيع اللاعب رؤيتها. يُنفَّذ اختبارا if كلاهما. أما مع elif، فلا يُنفَّذ الاختبار الثاني إلا إذا كان الأول خاطئًا، لذا لا يستجيب للضغط إلا أحدهما:

if crate.collidepoint(event.pos):
    dragging = True
elif gem.collidepoint(event.pos):
    print("Got it!")

اختبر أولًا ما رُسِم في الأعلى. عندئذٍ لا يصل الضغط على الصندوق أبدًا إلى الجوهرة التي تحته.

تجعل الحافة الداكنة الصندوق يبدو صلبًا. ارسم Rect نفسه مرة أخرى بلون أغمق وبعرض محدد، فيُرسَم حدّه الخارجي فقط فوق التعبئة.

challenge icon

التحدي

سهل

اجعل الصندوق يُخفي الجوهرة، وامنع الضغط عليه من التقاط الجوهرة.

  1. انقل سطر رسم الصندوق إلى ما بعد مخطط الجوهرة، وارسم أسفله crate مجددًا باللون (110, 70, 35) وبعرض 3 ليكون حافته.
  2. في فرع 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