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.
Desafío
IntermedioLa barra espaciadora suelta cajas y cada aterrizaje añade 12 a shake. Reduce la intensidad:
- Cambia el aterrizaje para que
shakenunca supere 18:shake = min(shake + 12, 18). - Asigna
shake_on = Trueantes del bucle; la tecla S lo alterna. - Elige un desplazamiento aleatorio solo mientras
shake_onsea verdadero. - Después de dibujar el mundo, muestra
Shake: OnoShake: Offen 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()
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
1Efectos de sonido
Cargar un sonidoSonido al ocurrir un eventoVolumen del sonidoSonidos y teclas presionadas4Sacudida de pantalla y destello de impacto
Sacudida de pantallaDestello de impactoPausa tras el impactoMantén la sutilezaPractica por tu cuenta: Playground de Pygame