Voltar para o Blog
Quest Log

Animação de Dano e Morte: Feedback que o Jogador Sente

Personagem em pixel art jogado para trás por um golpe, com a silhueta branca do flash de dano sobreposta

Animação de dano de personagem e de morte em sprite: hit reaction de 1 a 3 frames, flash branco, knockback, i-frames e o que desenhar ou fazer no código.

Ferramenta:Aseprite

Animação de Dano e Morte: Feedback que o Jogador Sente

A animação de dano de um personagem existe para responder uma pergunta em menos de um quarto de segundo: "eu fui atingido?". Na prática, ela é curta (1 a 3 frames de hit reaction) e trabalha junto com efeitos que a engine faz por código: flash branco, knockback, hit stop e piscar de invencibilidade. A animação de morte fecha o ciclo e precisa deixar claro que acabou.

Este post separa o que você desenha do que o código faz, com tempos em milissegundos para cada parte, e mostra como montar dano e morte para o jogador e para inimigos sem que o feedback atrapalhe o controle.

Por que dano e morte são feedback

Em combate, o jogador está olhando para muita coisa ao mesmo tempo. Se tomar dano não for óbvio, ele só percebe quando a vida acabou, e a sensação é de injustiça. Se for exagerado, ele perde o controle do personagem a cada arranhão e o jogo fica frustrante.

O bom feedback de dano é rápido, legível e não trava o controle por mais tempo do que o design quer. Ele combina várias camadas pequenas, cada uma barata de fazer:

  • Uma pose de impacto (desenhada).
  • Um flash de cor (código ou frame extra).
  • Um empurrão para trás (código).
  • Uma pausa curtíssima (código).
  • Um som (áudio).

Nenhuma delas sozinha resolve. Juntas, o jogador sente o golpe sem precisar olhar para a barra de vida.

Animação de dano personagem: hit reaction curta

A hit reaction é a pose do corpo reagindo ao golpe. Desenhe no Aseprite, em 32x32:

Versão de 1 frame: a cabeça vai para trás, o tronco inclina para longe do golpe, os braços abrem, um pé sai do chão. Olhos fechados ou arregalados. É uma pose extrema, e por isso funciona com um frame só: ela fica na tela de 150 a 250 ms e o personagem volta à idle.

Versão de 2 frames:

  1. Impacto: a pose extrema acima, 100 ms.
  2. Recuperação: meio caminho de volta para a idle, tronco ainda inclinado, 100 ms.

Versão de 3 frames: acrescente um frame de "assentamento" com o corpo 1 pixel mais baixo, como quem firma os pés. Use em personagens pesados.

Crie a tag hurt cobrindo esses frames, com direção Forward e sem loop. O post de tags de animação no Aseprite mostra a nomenclatura que bate com a exportação.

Uma regra de leitura: a hit reaction sempre empurra o corpo para longe da direção do golpe. Se o golpe veio da direita, o personagem inclina para a esquerda. Como o sprite costuma ser espelhado pela direção que o personagem olha, desenhe a reação para "golpe vindo da frente" e deixe a engine escolher se espelha.

Flash branco e piscar (i-frames)

Flash branco. Por 1 a 3 frames de jogo (cerca de 16 a 50 ms a 60 FPS), o sprite inteiro fica branco. É o sinal mais forte de "acertou". Dois jeitos:

  • Desenhado: duplique o frame de impacto, selecione o personagem e pinte tudo de branco mantendo o contorno, ou a silhueta toda. A engine mostra esse frame por um instante. Funciona em qualquer engine sem shader.
  • Por shader: um shader de sprite que mistura a cor original com branco por uma intensidade controlada pelo código. Na Godot, um shader canvas_item com mix(cor.rgb, vec3(1.0), intensidade); na Unity com URP, um Shader Graph do tipo Sprite Unlit com um Lerp para branco. Serve para todos os personagens de uma vez.

Mudar a cor do SpriteRenderer na Unity ou o modulate na Godot para branco não faz nada: essas propriedades multiplicam a cor do sprite, e branco é o valor neutro. Para escurecer ou avermelhar elas servem; para clarear, não.

Piscar (i-frames). Depois do dano, o personagem fica invencível por 0,5 a 1,5 segundo e pisca para mostrar isso. O piscar é puro código: liga e desliga o sprite (ou alterna a transparência) a cada 80 a 100 ms. Na Unity, arquivo DamageBlink.cs:

using System.Collections;
using UnityEngine;

public class DamageBlink : MonoBehaviour
{
    [SerializeField] private SpriteRenderer spriteRenderer;
    [SerializeField] private float invincibleDuration = 1f;
    [SerializeField] private float blinkInterval = 0.1f;

    private bool isInvincible;

    public bool IsInvincible => isInvincible;

    public void StartInvincibility()
    {
        if (!isInvincible)
        {
            StartCoroutine(BlinkRoutine());
        }
    }

    private IEnumerator BlinkRoutine()
    {
        isInvincible = true;
        float elapsed = 0f;

        while (elapsed < invincibleDuration)
        {
            spriteRenderer.enabled = !spriteRenderer.enabled;
            yield return new WaitForSeconds(blinkInterval);
            elapsed += blinkInterval;
        }

        spriteRenderer.enabled = true;
        isInvincible = false;
    }
}

O script de vida chama StartInvincibility() ao tomar dano e ignora novos golpes enquanto IsInvincible for verdadeiro. Na Godot, a mesma lógica cabe num Timer alternando visible do Sprite2D ou do AnimatedSprite2D.

Knockback e hit stop

Knockback é o empurrão. O personagem é lançado alguns pixels para longe do golpe, normalmente com um pequeno arco para cima. É física: o código aplica uma velocidade e tira o controle do jogador por 100 a 300 ms. A animação hurt toca durante esse empurrão, por isso ela não precisa ter deslocamento desenhado. Desenhe a pose no lugar e deixe o código mover.

Hit stop é a pausa. O jogo congela por 50 a 100 ms no momento do impacto, para atacante e vítima. É o que dá peso ao golpe. O frame que fica na tela durante a pausa é o primeiro da hit reaction, então ele precisa ser a pose mais clara.

O post de game feel e juice aprofunda hit stop, tremor de tela e a ordem em que esses efeitos entram.

Repare que até aqui metade do feedback é código. A arte entrega a pose; a engine entrega tempo, cor e movimento. É justamente nessa costura que quem sabe desenhar costuma travar, porque nenhum dos dois lados funciona sem o outro.

Curso de Arte 2D
Quer fazer a arte do seu jogo?

No curso de Arte 2D para Jogos da CursoGame.Dev você vai do rabisco ao portfólio: personagens, cenários, tilesets, UI e animação, sem precisar saber desenhar.

Conhecer o curso de Arte 2D
Suporte no WhatsAppAcesso vitalícioGarantia de 7 dias

Pensar a animação já sabendo o que a engine vai somar por cima (flash, empurrão, pausa) evita desenhar frames que o código faria melhor, e é o que deixa o combate com cara de jogo pronto. O lado da programação está no post de sistema de combate corpo a corpo.

Animação de morte sprite

A morte do jogador e a de um inimigo comum têm funções diferentes.

Morte do jogador (6 a 10 frames):

  1. Impacto final: a mesma pose da hit reaction, mais exagerada. 100 ms.
  2. Perda de equilíbrio: joelhos dobrando, arma escapando da mão. 120 ms.
  3. Queda: corpo inclinado a 45 graus. 100 ms.
  4. Chão: corpo deitado, 1 pixel acima da linha do chão. 80 ms.
  5. Quique: corpo 1 ou 2 pixels mais alto, como quem bate e volta. 80 ms.
  6. Repouso: deitado, olhos fechados. Fica parado de 500 a 1000 ms antes de a tela escurecer.

A arma pode virar um objeto separado que cai e quica sozinho, por código, o que economiza desenho e fica mais físico.

Morte de inimigo comum (3 a 5 frames ou efeito): o combate continua, então ela não pode ocupar a tela. Duas opções que funcionam:

  • Poof: 1 frame de hit reaction e o sprite troca por uma nuvem de fumaça ou explosão pequena de 4 a 6 frames, a 60 ms cada. A mesma nuvem serve para todos os inimigos.
  • Dissolve: o inimigo cai em 2 ou 3 frames e some piscando, com o mesmo código dos i-frames.

Chefe merece uma morte própria, longa, com explosões em sequência. Ali o jogo pode parar.

O que desenhar e o que fazer por código

EfeitoDesenhadoPor código
Pose de impactoSim
Flash brancoOpcional (frame branco)Shader ou troca de frame
Piscar dos i-framesSim
KnockbackSim
Hit stopSim
Tremor de telaSim
Partículas de impactoSprite do efeitoInstanciar no ponto
Queda e quique da morteSim
Arma voando na morteSim, com física
Fumaça do poofSim, uma vezReaproveitar em todos

A regra geral: desenhe poses; deixe o código fazer tempo, deslocamento e cor. Assim um mesmo frame de impacto serve para golpes de várias forças, mudando só o empurrão e a pausa.

Erros comuns

Hit reaction longa. O jogador perde o controle a cada golpe. 1 a 3 frames, até 300 ms no total.

Flash pelo SpriteRenderer ou modulate. Não fica branco. Frame branco ou shader.

Deslocamento desenhado no sprite. O personagem "teleporta" de volta ao fim da animação. Desenhe no lugar e deixe o knockback mover.

Sem i-frames. O jogador toma três golpes seguidos do mesmo inimigo e morre sem entender. Invencibilidade curta e visível.

Morte de inimigo longa. Atrapalha o combate. Poof ou dissolve.

Mesma reação para dano e morte. O jogador não percebe que morreu até a tela escurecer. A morte começa com uma pose mais exagerada que o dano.

Próximo passo

Desenhe a hit reaction de 1 frame e um frame branco do seu personagem, teste com knockback e i-frames na engine e só depois decida se precisa de mais frames. Em seguida, faça um poof de 5 frames que sirva para todos os inimigos.

Perguntas frequentes

Quantos frames tem uma animação de dano?

De 1 a 3. Um frame de pose de impacto já funciona, principalmente somado a flash branco e knockback feitos pela engine. Mais do que 3 frames deixa o personagem preso na reação e o jogador perde o controle por tempo demais.

O que são i-frames?

São frames de invencibilidade: um intervalo curto depois de tomar dano em que o personagem não pode ser atingido de novo. O piscar do sprite é o jeito clássico de mostrar ao jogador que essa janela está ativa.

Como fazer o sprite piscar branco quando leva dano?

Ou você desenha um frame de silhueta branca e troca por ele durante 1 ou 2 frames de jogo, ou usa um shader que mistura a cor do sprite com branco. Mudar a cor do SpriteRenderer na Unity ou o modulate na Godot não funciona para branco, porque essas propriedades multiplicam a cor e o branco é o valor neutro.

A animação de morte precisa ser longa?

A do jogador pode ser mais longa, de 6 a 10 frames, porque é um momento de pausa e o jogo vai reiniciar. A de inimigo comum deve ser curta, de 3 a 5 frames, ou virar um efeito de explosão, para não atrapalhar o combate que continua.