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 -= 1Cuando 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.
Desafío
Intermedio- 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. - Antes del bucle, establece
time_left = 1800. En el bucle, después de los eventos, réstale 1 mientras sea mayor que 0. - Gestiona
MOUSEBUTTONDOWNyMOUSEMOTIONsolo mientrastime_left > 0. - 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()
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
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