Vibração da Tela
Parte da seção Som e sensação de jogo do Journey de Pygame da Coddy. Lição 12 de 23.
Uma caixa pesada atinge o chão e toda a imagem dá um solavanco por um instante. Isso é tremor de tela: por alguns quadros, tudo é desenhado alguns pixels fora do lugar, de uma maneira diferente a cada quadro.
Para mover tudo de uma vez, desenhe o mundo em uma Surface própria em vez de desenhá-lo na tela e, depois, faça o blit dessa Surface na tela com um deslocamento:
world = pygame.Surface((480, 360))No loop, as chamadas de desenho que usavam screen agora usam world. Depois, escolha o deslocamento:
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 conta os quadros restantes do tremor. Ao aterrissar, seu valor passa a ser 12. Como amount é shake // 3, nos primeiros quadros a imagem se move até 4 pixels, depois 3, 2, 1 e nenhum: o solavanco diminui gradualmente em vez de parar de repente. Preencha primeiro a tela de preto, porque um mundo deslocado em 4 pixels deixa uma faixa estreita sem cobertura.
Desafio
MédioA barra de espaço solta uma caixa, e o pouso dela define shake = 12, que ainda não é usado para nada. Faça a tela tremer:
- Antes do loop, crie
world = pygame.Surface((480, 360)). - Desenhe o fundo, o chão, o poste e as caixas em
worldem vez de emscreen. - Enquanto
shakefor maior que 0, escolha um deslocamento comamount = shake // 3erandom.randint(-amount, amount)para x e y, depois diminuashakeem 1. - Preencha a tela com preto e desenhe
worldno deslocamento.
Experimente você mesmo
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 as lições de Som e sensação de jogo
4Vibração da Tela e Flash de Impacto
Vibração da TelaFlash de ImpactoPausa no ImpactoMantenha a DiscriçãoPratique por conta própria: Playground de Pygame