Menu
CoddyTech

Búsqueda de gemas

Parte de la sección El bucle del juego del Journey de Pygame de Coddy. Lección 17 de 32.

Ahora la caja se convierte en el juego. Cada gema aparece debajo de la caja: arrastra la caja para apartarla y haz clic en la gema; la caja se mueve sobre la siguiente. Una ronda dura 30 segundos.

Coloca la caja sobre la gema asignándole el centro de la gema: crate.center = gem.center. Hazlo antes del bucle y cada vez que aparezca una gema nueva.

Cuenta el tiempo en fotogramas. A 60 fotogramas por segundo, 30 segundos son 1800 fotogramas:

time_left = 1800

while running:
    # eventos
    if time_left > 0:
        time_left -= 1

Cuando time_left llega a 0, el juego deja de aceptar clics y arrastres, y la fila del marcador muestra el resultado. Añade and time_left > 0 a las comprobaciones de MOUSEBUTTONDOWN y MOUSEMOTION.

Una barra en la parte superior muestra el tiempo restante. Su anchura representa la parte de la ronda que queda: 480 * time_left // 1800 vale 480 al principio, 240 a la mitad y 0 al final.

challenge icon

Desafío

Intermedio
  1. Después de crear la caja, establece crate.center = gem.center. Haz lo mismo después de que la gema recogida obtenga una nueva ubicación.
  2. Antes del bucle, establece time_left = 1800. En el bucle, después de los eventos, réstale 1 mientras sea mayor que 0.
  3. Gestiona MOUSEBUTTONDOWN y MOUSEMOTION solo mientras time_left > 0.
  4. Después de la fila de puntuación, dibuja la barra de tiempo: verde (120, 200, 120) en (0, 0, 480 * time_left // 1800, 6).

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)
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()
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de El bucle del juego

Practica por tu cuenta: Playground de Pygame