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.
Sfida
Medio- Prima del ciclo, crea
crate = pygame.Rect(40, 230, 60, 60)edragging = False. - Su
MOUSEBUTTONDOWN, impostadragging = Truequando il clic avviene sulla cassa; altrimenti (elif) verifica la gemma come prima. - Imposta
dragging = FalsesuMOUSEBUTTONUP. SuMOUSEMOTION, mentre trascini, sposta la cassa dievent.rel. - 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