Menu
CoddyTech

La cassa nasconde la gemma

Fa parte della sezione Il game loop del percorso Pygame di Coddy. Lezione 18 di 35.

La cassa viene disegnata prima della gemma, quindi la gemma appare sopra di essa. Per una cassa sotto cui la gemma può nascondersi, disegna la cassa dopo la gemma: ciò che viene disegnato per ultimo copre ciò che è già presente.

Quindi, una pressione sulla cassa non deve raggiungere il test della gemma e raccogliere una gemma che il giocatore non può vedere. Vengono eseguiti entrambi i test if. Con elif, il secondo viene eseguito solo quando il primo è falso, quindi solo uno dei due rileva la pressione:

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

Verifica prima ciò che viene disegnato sopra. Una pressione sulla cassa non raggiunge mai la gemma che si trova dietro.

Un bordo più scuro fa sembrare solida una scatola. Disegna di nuovo lo stesso Rect con un colore più scuro e una larghezza, così viene disegnato solo il contorno, sopra il riempimento.

challenge icon

Sfida

Facile

Fai in modo che la cassa nasconda la gemma e impedisca a un clic su di essa di raccoglierla.

  1. Sposta la riga che disegna la cassa dopo il contorno della gemma e, sotto di essa, disegna di nuovo crate in (110, 70, 35) con larghezza 3, come bordo.
  2. Nel ramo MOUSEBUTTONDOWN, cambia l’if della gemma in elif, sotto il controllo della cassa.

Premi «Gioca», trascina la cassa sulla gemma e fai clic su di essa: la gemma rimane nascosta e non appare alcun segno rosa. Poi premi «Verifica».

Provalo tu

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()

Tutte le lezioni di Il game loop

Esercitati da solo: Playground Pygame