Arrastra la caja
Parte de la sección El bucle del juego del Journey de Pygame de Coddy. Lección 16 de 32.
Arrastrar requiere tres eventos. El botón se pulsa sobre la caja (MOUSEBUTTONDOWN), el puntero se mueve (MOUSEMOTION, muchas veces) y se suelta el botón (MOUSEBUTTONUP). Una variable recuerda si hay un arrastre en curso entre estos eventos:
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)El valor event.rel de un evento MOUSEMOTION indica cuánto se movió el puntero desde el evento anterior, como (x, y). crate.move_ip(event.rel) mueve la caja en la misma medida, así que el punto donde la agarraste permanece debajo del puntero.
La caja se dibuja después de la gema, así que puede ocultarla. Una pulsación sobre la caja no debe recoger la gema que está debajo: comprueba primero la caja y luego la gema con elif, para que solo una de ellas responda a la pulsación.
Desafío
Intermedio- Antes del bucle, crea
crate = pygame.Rect(40, 230, 60, 60)ydragging = False. - Al recibir
MOUSEBUTTONDOWN, establecedragging = Truecuando se pulse sobre la caja; de lo contrario (elif), comprueba la gema como antes. - Establece
dragging = Falseal recibirMOUSEBUTTONUP. Mientras se arrastra, al recibirMOUSEMOTION, mueve la caja segúnevent.rel. - Después del contorno de la gema, dibuja la caja de color marrón
(150, 100, 50), con un borde de color(110, 70, 35)de 3 píxeles de ancho.
Pruébalo tú mismo
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()
Todas las lecciones de El bucle del juego
1Mueve un cuadrado
Abre una ventanaRellena el fondo4Movimiento basado en el tiempo
Tiempo deltaPíxeles por segundoVector2Aceleración y fricciónReaparecer al otro lado de la pantalla3El ratón
Sigue el punteroHaz clic en la gemaPractica por tu cuenta: Playground de Pygame