Menu
CoddyTech

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

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

challenge icon

Sfida

Facile

Nascondi ogni gemma sotto la cassa.

  1. Subito dopo aver creato crate, imposta crate.center = gem.center.
  2. Nel ramo della gemma, dopo il nuovo gem.y, imposta di nuovo crate.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