Menu
CoddyTech

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 -= 1

Quando 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.

challenge icon

Sfida

Medio
  1. Dopo aver creato la cassa, imposta crate.center = gem.center. Fai lo stesso dopo che una gemma raccolta riceve una nuova posizione.
  2. Prima del ciclo, imposta time_left = 1800. Nel ciclo, dopo gli eventi, sottrai 1 finché è maggiore di 0.
  3. Gestisci MOUSEBUTTONDOWN e MOUSEMOTION solo mentre time_left > 0.
  4. 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()
quiz iconMettiti alla prova

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