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.
Sfida
FacileFai in modo che la cassa nasconda la gemma e impedisca a un clic su di essa di raccoglierla.
- Sposta la riga che disegna la cassa dopo il contorno della gemma e, sotto di essa, disegna di nuovo
cratein(110, 70, 35)con larghezza3, come bordo. - Nel ramo
MOUSEBUTTONDOWN, cambia l’ifdella gemma inelif, 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
3Il mouse
Segui il puntatoreClicca la gemmaEsercitati da solo: Playground Pygame