Efeitos

Efeitos Visuais e Iluminação

Módulos: particles, effects | Dificuldade: Intermediário

Um jogo funcional não é o suficiente. O Game Juice (o “Suco” do jogo) é o feedback visual que faz a gameplay ser satisfatória. A Power PPlay 2.0 fornece emissores de partículas nativos, shakes de tela e um sistema de iluminação dinâmica (Fog of War) via renderização subtrativa.

1. Screen Shake e Flash (Feedback Cinestésico)

A classe ScreenEffects afeta diretamente a Câmera e o Buffer de Tela. Use-os para impactos ou quando o jogador levar dano.

from PPlay.effects import ScreenEffects

# No momento em que o player é atingido:
if levou_dano:
    # Intensidade 10 pixels, Duração 0.2 segundos
    ScreenEffects.shake(10, 0.2)
    # Pisca a tela de vermelho com opacidade por 0.1s
    ScreenEffects.flash((255, 0, 0), 0.1)

# Não se esqueça de colocar no final do seu loop()!
ScreenEffects.update()
ScreenEffects.apply_to_camera()

2. Emissor de Partículas

A classe ParticleEmitter gera e destrói centenas de pequenos objetos coloridos automaticamente, criando rastros de magia, poeira de pulo ou explosões.

from PPlay.particles import ParticleEmitter

fogo = ParticleEmitter(0, 0)
fogo.cor = (255, 100, 0) # Laranja
fogo.vida_base = 0.5     # Meio segundo de vida por partícula
fogo.intensidade = 5     # 5 partículas por frame

# Se for um efeito contínuo (ex: Tocha ou Foguete):
fogo.set_pos(foguete.x, foguete.y)
fogo.emitir()

# Se for um efeito único (ex: Bomba explodindo):
fogo.explodir(quantidade=50)

# No final do loop():
fogo.update()
fogo.draw()

3. O Sistema de Iluminação (LightingSystem)

Ideal para jogos de terror ou exploração. A engine pinta uma “névoa escura” sobre o mapa e você adiciona círculos de luz que “furam” essa escuridão usando o modo BLEND_RGBA_ADD.

from PPlay.effects import LightingSystem

luzes = LightingSystem(opacidade_noite=240) # Quase breu total

while True:
    # Adiciona a lanterna do player no frame atual
    luzes.lights.append((player.x + 16, player.y + 16, raio=150, brilho=255))
    
    # Adiciona uma tocha fixa no mapa
    luzes.lights.append((500, 300, raio=200, brilho=180))

    # O draw() pinta a escuridão e aplica as luzes
    # DEVE ser o penúltimo comando do desenho (antes da UI)
    luzes.draw()