Menu
CoddyTech

Trascina la cassa

Fa parte della sezione Il game loop del percorso Pygame di Coddy. Lezione 16 di 32.

Per trascinare servono tre eventi. Il pulsante viene premuto sulla cassa (MOUSEBUTTONDOWN), il puntatore si sposta (MOUSEMOTION, molte volte) e il pulsante viene rilasciato (MOUSEBUTTONUP). Una variabile ricorda se è in corso un trascinamento:

elif event.type == pygame.MOUSEBUTTONDOWN:
    if crate.collidepoint(event.pos):
        dragging = True
elif event.type == pygame.MOUSEBUTTONUP:
    dragging = False
elif event.type == pygame.MOUSEMOTION and dragging:
    crate.move_ip(event.rel)

event.rel di un evento MOUSEMOTION indica di quanto si è spostato il puntatore dall'evento precedente, come (x, y). crate.move_ip(event.rel) sposta la cassa della stessa quantità, così il punto che hai afferrato rimane sotto il puntatore.

La cassa viene disegnata dopo la gemma, quindi può nasconderla. Un clic sulla cassa non deve quindi raccogliere la gemma sottostante: controlla prima la cassa e poi la gemma con elif, così solo una delle due riceve il clic.

challenge icon

Sfida

Medio
  1. Prima del ciclo, crea crate = pygame.Rect(40, 230, 60, 60) e dragging = False.
  2. Su MOUSEBUTTONDOWN, imposta dragging = True quando il clic avviene sulla cassa; altrimenti (elif) verifica la gemma come prima.
  3. Imposta dragging = False su MOUSEBUTTONUP. Su MOUSEMOTION, mentre trascini, sposta la cassa di event.rel.
  4. Dopo il contorno della gemma, disegna la cassa in marrone (150, 100, 50), con un bordo (110, 70, 35) largo 3 pixel.

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)
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 gem.collidepoint(event.pos):
                score += 1
                gem.x = random.randint(15, 435)
                gem.y = random.randint(55, 315)

    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)
    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