Menu
CoddyTech

Mantén la sutileza

Parte de la sección Sonido y sensaciones del juego del Journey de Pygame de Coddy. Lección 15 de 23.

La sensación del juego es como un condimento. Un poco de movimiento hace que un aterrizaje se sienta pesado; demasiado hace que el juego sea difícil de seguir y puede marear a los jugadores. Dos hábitos ayudan a mantenerlo bajo control.

Ponle un límite. Cuando los efectos se acumulan, pueden crecer sin fin. Aquí cada aterrizaje añade 12 a shake; cuatro cajas que aterrizan a la vez hacen que supere 40, y la vista salta 13 píxeles. min() le pone un límite máximo:

shake = min(shake + 12, 18)

Ahora el movimiento sigue durando más cuando las cajas siguen aterrizando, pero nunca desplaza más de 18 // 3, 6 píxeles.

Deja que los jugadores lo desactiven. Algunas personas no pueden jugar con la pantalla en movimiento. Una opción requiere una variable:

shake_on = True
...
if shake_on:
    offset = (random.randint(-amount, amount), random.randint(-amount, amount))

Dibuja la etiqueta después de dibujar el mundo, directamente en la pantalla. El texto que forma parte de la interfaz debe permanecer quieto mientras el mundo tiembla.

challenge icon

Desafío

Intermedio

La barra espaciadora suelta cajas y cada aterrizaje añade 12 a shake. Reduce la intensidad:

  1. Cambia el aterrizaje para que shake nunca supere 18: shake = min(shake + 12, 18).
  2. Asigna shake_on = True antes del bucle; la tecla S lo alterna.
  3. Elige un desplazamiento aleatorio solo mientras shake_on sea verdadero.
  4. Después de dibujar el mundo, muestra Shake: On o Shake: Off en la pantalla en (10, 10).

Pruébalo tú mismo

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Crate Drop")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 28)

thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 0
world = pygame.Surface((480, 360))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            falling.append(pygame.Rect(random.randint(140, 400), -40, 40, 40))

    for crate in falling:
        crate.y += 8
        if crate.bottom >= 300:
            crate.bottom = 300
            landed.append(crate)
            thud_sound.play()
            shake += 12
    falling = [crate for crate in falling if crate.bottom < 300]

    world.fill((30, 30, 46))
    pygame.draw.rect(world, (80, 80, 100), (0, 300, 480, 60))
    pygame.draw.rect(world, (80, 160, 255), (60, 220, 30, 80))
    for crate in falling + landed:
        pygame.draw.rect(world, (170, 110, 60), crate)

    offset = (0, 0)
    if shake > 0:
        amount = shake // 3
        offset = (random.randint(-amount, amount), random.randint(-amount, amount))
        shake -= 1
    screen.fill((0, 0, 0))
    screen.blit(world, offset)
    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 Sonido y sensaciones del juego

Practica por tu cuenta: Playground de Pygame