Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio
  1. Antes del bucle, crea crate = pygame.Rect(40, 230, 60, 60) y dragging = False.
  2. Al recibir MOUSEBUTTONDOWN, establece dragging = True cuando se pulse sobre la caja; de lo contrario (elif), comprueba la gema como antes.
  3. Establece dragging = False al recibir MOUSEBUTTONUP. Mientras se arrastra, al recibir MOUSEMOTION, mueve la caja según event.rel.
  4. 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

Practica por tu cuenta: Playground de Pygame