Caccia alla gemma
Fa parte della sezione Il game loop del percorso Pygame di Coddy. Lezione 17 di 32.
Ora la cassa diventa il gioco. Ogni gemma appare sotto la cassa: trascina via la cassa e fai clic sulla gemma; la cassa si sposta su quella successiva. Un round dura 30 secondi.
Posiziona la cassa sulla gemma assegnandole il centro della gemma: crate.center = gem.center. Fallo prima del ciclo e ogni volta che appare una nuova gemma.
Conta il tempo in frame. A 60 frame al secondo, 30 secondi corrispondono a 1800 frame:
time_left = 1800
while running:
# eventi
if time_left > 0:
time_left -= 1Quando time_left raggiunge 0, il gioco smette di accettare clic e trascinamenti e la riga del punteggio mostra il risultato. Aggiungi and time_left > 0 ai controlli MOUSEBUTTONDOWN e MOUSEMOTION.
Una barra in alto mostra il tempo rimasto. La sua larghezza corrisponde alla parte del round ancora da giocare: 480 * time_left // 1800 vale 480 all'inizio, 240 a metà e 0 alla fine.
Sfida
Medio- Dopo aver creato la cassa, imposta
crate.center = gem.center. Fai lo stesso dopo che una gemma raccolta riceve una nuova posizione. - Prima del ciclo, imposta
time_left = 1800. Nel ciclo, dopo gli eventi, sottrai 1 finché è maggiore di 0. - Gestisci
MOUSEBUTTONDOWNeMOUSEMOTIONsolo mentretime_left > 0. - Dopo la riga del punteggio, disegna la barra del tempo: verde
(120, 200, 120)in(0, 0, 480 * time_left // 1800, 6).
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()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Il game loop
Esercitati da solo: Playground Pygame