Mantenha a Discrição
Parte da seção Som e sensação de jogo do Journey de Pygame da Coddy. Lição 15 de 23.
A sensação do jogo é como um tempero. Um pouco de tremor deixa um pouso pesado; muito tremor dificulta a leitura do jogo e pode fazer os jogadores passarem mal. Dois hábitos ajudam a controlar isso.
Limite-o. Quando os efeitos se acumulam, eles podem crescer sem parar. Aqui, cada pouso adiciona 12 a shake; quatro caixas pousando juntas fazem o valor passar de 40, e a tela salta 13 pixels. min() estabelece um limite máximo:
shake = min(shake + 12, 18)Agora o tremor ainda dura mais quando as caixas continuam pousando, mas nunca se desloca mais do que 18 // 3, ou seja, 6 pixels.
Permita que os jogadores desativem o efeito. Algumas pessoas não conseguem jogar com a tela se movendo. Uma configuração custa uma variável:
shake_on = True
...
if shake_on:
offset = (random.randint(-amount, amount), random.randint(-amount, amount))Desenhe o rótulo depois de desenhar o mundo com blit, diretamente na tela. O texto que faz parte da interface deve permanecer parado enquanto o mundo treme.
Desafio
MédioA tecla Space solta caixas, e cada aterrissagem adiciona 12 a shake. Diminua a intensidade:
- Altere a aterrissagem para que
shakenunca ultrapasse 18:shake = min(shake + 12, 18). - Defina
shake_on = Trueantes do loop; S alterna seu valor. - Escolha um deslocamento aleatório somente enquanto
shake_onfor verdadeiro. - Depois de desenhar o mundo na tela, exiba
Shake: OnouShake: Offna tela em(10, 10).
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()
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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
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