Gemma sotto la cassa
Fa parte della sezione Il game loop del percorso Pygame di Coddy. Lezione 19 di 35.
Ora la cassa diventa il gioco. Ogni gemma appare sotto la cassa: trascina via la cassa e fai clic sulla gemma, e la cassa si sposta sopra quella successiva.
Un Rect ha un center, il punto al centro. Assegna a un Rect il centro di un altro e si posizionerà esattamente sopra di esso, qualunque siano le loro dimensioni:
gem = pygame.Rect(300, 120, 30, 30)
crate = pygame.Rect(0, 0, 60, 60)
crate.center = gem.centerSi sposta solo crate, in (285, 105, 60, 60). Fallo una volta prima del ciclo per la prima gemma e poi di nuovo ogni volta che una gemma riceve una nuova posizione.
Sfida
FacileNascondi ogni gemma sotto la cassa.
- Subito dopo aver creato
crate, impostacrate.center = gem.center. - Nel ramo della gemma, dopo il nuovo
gem.y, imposta di nuovocrate.center = gem.center.
Premi «Gioca», trascina via la cassa e fai clic sulla gemma: la cassa salta sopra quella successiva. 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
elif 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))
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)
pygame.draw.rect(screen, (150, 100, 50), crate)
pygame.draw.rect(screen, (110, 70, 35), crate, 3)
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