Sacudida de pantalla
Parte de la sección Sonido y sensaciones del juego del Journey de Pygame de Coddy. Lección 12 de 23.
Una caja pesada golpea el suelo y toda la vista da una sacudida por un momento. Eso es sacudida de pantalla: durante unos pocos fotogramas, todo se dibuja con unos pocos píxeles de desplazamiento, de una forma distinta en cada fotograma.
Para moverlo todo a la vez, dibuja el mundo en una Surface propia en lugar de hacerlo en la pantalla, y después blitea esa Surface en la pantalla con un desplazamiento:
world = pygame.Surface((480, 360))En el bucle, las llamadas de dibujo que usaban screen ahora usan world. Después, elige el desplazamiento:
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)shake cuenta los fotogramas que quedan de sacudida. Al aterrizar, se establece en 12. Como amount es shake // 3, los primeros fotogramas el desplazamiento puede ser de hasta 4 píxeles; luego, 3, 2, 1 y ninguno: la sacudida se va atenuando en lugar de detenerse bruscamente. Primero, rellena la pantalla de negro, porque al mover el mundo 4 píxeles queda una franja estrecha sin cubrir.
Desafío
IntermedioLa barra espaciadora suelta una caja y, al aterrizar, establece shake = 12, que todavía no usa nada. Agita la vista:
- Antes del bucle, crea
world = pygame.Surface((480, 360)). - Dibuja el fondo, el suelo, el poste y las cajas en
worlden lugar de enscreen. - Mientras
shakesea mayor que 0, elige un desplazamiento conamount = shake // 3yrandom.randint(-amount, amount)para x e y; después, reduceshakeen 1. - Rellena la pantalla de negro y dibuja
worlden el desplazamiento.
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()
thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 0
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]
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 80, 100), (0, 300, 480, 60))
pygame.draw.rect(screen, (80, 160, 255), (60, 220, 30, 80))
for crate in falling + landed:
pygame.draw.rect(screen, (170, 110, 60), crate)
pygame.display.flip()
clock.tick(60)
pygame.quit()
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