Um guia prático para quem quer montar ou entender joguinho de escovar os dentes
Se você está procurando um jogo simples para ensinar crianças a escovar os dentes, ou precisa de uma ferramenta rápida para clínicas odontológicas usarem com pacientes pequenos, dá pra fazer algo decente sem gastar fortuna. O problema é que a maioria das opções aí fora são extremamente limitadas, têm microtransações disfarçadas. Vou explicar como funciona por dentro.
O que é o joguinho de escovar os dentes, de verdade
Aprenda sobre o joguinho de escovar os dentes na prática: basicamente é uma simulação interativa onde a criança arrasta uma escova de dente digital sobre dentes sujos (geralmente representados como manchas amarelas ou verdes) até que fiquem limpos. Alguns têm cronômetro, outros pontuação, outros só deixam o bebê brincar mesmo. A mecânica central é sempre a mesma — swipe ou touch para limpar, e quando todos os dentes estão limpos, o jogo acaba ou avança. Isso parece óbvio, mas muita gente subestima o quão importante é a precisão do feedback visual. Se a criança passa a escova em cima do dente e a mancha simplesmente some sem transição, ela não entende a relação causa e efeito. O ideal é um gradiente: a mancha clareia progressivamente conforme o toque se mantém na região. Isso faz toda a diferença na aprendizagem.
Também tem a questão do tempo. Escovação real dura dois minutos. Jogos bem feitos incluem um temporizador com contagem regressiva ou um indicador sonoro de quando completar cada quadrante da boca. Joguinhos que acabam quando a criança termina os dentes sem esse feedback transmitem a mensagem errada de que escovar é rápido e descomplicado. E não é.
Como eu construí o meu
Eu precisava de algo assim há uns dois anos. Minha sobrinha de quatro anos se recusava a escovar sozinha. Brincadeiras educativas eram a última opção que ela tolerava. Então eu montei um joguinho de escovar os dentes simples usando HTML5, CSS e JavaScript puro, rodando direto no navegador do tablet. Custo: zero. Tempo de desenvolvimento: umas seis horas. Aqui está o núcleo do que eu fiz. A estrutura básica é isso:
HTML: Uma div container com os dentes (divs ou SVGs posicionados), uma div para a escova que segue o cursor/toque, e um painel de manchas/sujeira sobrepostos. CSS: Os dentes ficam em grade ou arco. As manchas usam position absolute com opacidade inicial alta. A escova é um emoji ou sprite que recebe transform: translate baseado nas coordenadas do pointer.
JavaScript: O evento principal é pointermove (funciona com mouse e touch igual). A cada frame, verifico interseção entre a posição da escova e cada mancha. Se intersectar e o pointer estiver ativo, reduz a opacidade da mancha em um valor fixo (eu usei 0.03 por frame, o que em 120fps significa uns 2-3 segundos de escovação contínua por mancha — bem próximo do real). O detalhe que muita gente perde: usei requestAnimationFrame em vez de depender apenas do evento de toque. Eventos de toque podem pular frames em dispositivos mais simples, e isso cria aquela sensação de "a escova está travando". Com RAF, a animação fica fluida independente do dispositivo.
Problema que eu enfrentei e a solução
O maior problema que eu tive foi com a detecção de colisão. No início, eu usei bounding boxes retangulares para verificar se a escova tocava uma mancha. Funcionou no teste, mas quando minha sobrinha passou a escova na diagonal, rasgando vários dentes de uma vez, o sistema considerava que ela tinha "lixado" os dentes ao redor também e limpava manhas que nem estavam sendo tocadas. O feedback visual ficava estranho e ela percebia que o jogo estava "enganando". A solução foi trocar para detecção baseada em distância euclidiana com um raio de toque. Cada dente/mancha tem um ponto central (cx, cy). A escova também tem um ponto. Se a distância entre eles for menor que um raio definido (eu usei 40px), conta como toque. Assim, passa a escova na diagonal sem limpar tudo ao redor. Ficou muito mais preciso.
Outro problema menor: em tablets mais antigos, o pointerleave não disparava direito, então a escova ficava "grudada" e continuava limpando depois que a criança tirava o dedo. Eu resolvi adicionando um listener em pointerup que marca explicitamente o estado como inativo, independente do pointerleave.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Alternativas prontas no mercado
Se você não quer codar do zero, existem algumas opções. O app "Brush Burp" da Vengry é relativamente bom, tem modo de escovação guiada por quadrantes. O "Pedro Dentist" é mais focado em exame do que em escovação propriamente dita, mas ainda serve. Para web, tem projetos open-source no GitHub com o nome de "tooth brushing game" que você pode forkar e adaptar. O risco de usar soluções prontas é que elas raramente são customizáveis. Se você precisa de um app numa clínica específica com a marca do consultório, cores da equipe, ou integração com um sistema de recompensas (como estrelas que viram descontos na próxima consulta), vai precisar modificar o código. E aí volta pro passo anterior.
O que funciona na prática
Reforço positivo é essencial. Todo joguinho de escovar os dentes que preste precisa ter algum sistema de recompensa. Pode ser simples: ao limpar todos os dentes, aparece uma animação de confete, um som de aplauso, ou uma figurinha que a criança coleciona. Eu usei um sistema de estrelas — uma por dente limpo, máxima três estrelas por sessão. A criança volta a jogar para tentar melhorar a pontuação, o que aumenta o tempo total de escovação naturalmente. A dificuldadeprogressiva também ajuda. No começo, os dentes têm poucas manchas e são poucos. Conforme a criança melhora, aumente o número de dentes e a densidade das manchas. Meu protótipo tinha três níveis: fácil (4 dentes, mancha grossa), médio (8 dentes, manchas normais), difícil (12 dentes, manchas finas que exigem mais tempo de escovação por unidade de área).
Não adianta só colocar o jogo na frente da criança e esperar que ela aprenda. No começo, você precisa estar ao lado, mostrando como fazer o movimento certo — circular, devagar, cobrindo cada dente. O jogo é a ferramenta, não o professor. Isso é especialmente relevante para crianças abaixo de cinco anos, que ainda estão desenvolvendo coordenação motora fina.
Pegadinhas comuns ao desenvolver
Primeira pegadinha: muitos desenvolvedores esquecem de adaptar para telas pequenas. Um joguinho que funciona perfeitamente em um tablet de 10 polegadas pode ser impossível de usar em um celular de 5. Teste em múltiplos tamanhos antes de distribuir. Use viewport units e rem instead de px fixos. Segunda pegadinha: não confie apenas no CSS para as animações de limpeza. Se você animar a opacidade das manchas via CSS transition, a performance pode cair em dispositivos mais modestos, principalmente se houver muitos elementos animados simultaneamente. No meu caso, manipulatei diretamente a propriedade opacity no canvas ou via JS a cada frame, e a fluidez foi muito superior.
Terceira pegadinha: a escova precisa ter tamanho proporcional. Eu vi alguns jogos onde a escova era minúscula perto dos dentes, o que frustrava crianças com coordenação motora ainda em desenvolvimento. O raio de toque da escova deve ser pelo menos 1.5x o tamanho visual dela, pra dar margem de erro sem confundir o usuário.
Download e código
O código completo do joguinho que eu desenvolvi tá no meu repositório público. A pasta principal tem index.html, style.css e script.js, com comentários em português explicando cada parte. Tem também uma versão minificada pronta pra deploy. Se você quer algo mais básico pra testar rápido, comece com este esboço:
<div class="game-container">
<div class="mouth">
<div class="tooth" data-id="1">
<div class="plaque"></div>
</div>
<!-- repetir para todos os dentes -->
</div>
<div class="brush"></div>
<div class="timer">2:00</div>
</div>
E no JavaScript, o loop principal:
let isBrushing = false;
const brush = document.querySelector('.brush');
const plaques = document.querySelectorAll('.plaque');
document.addEventListener('pointermove', (e) => {
brush.style.left = e.clientX + 'px';
brush.style.top = e.clientY + 'px';
if (!isBrushing) return;
plaques.forEach(plaque => {
const rect = plaque.getBoundingClientRect();
const cx = rect.left + rect.width / 2;
const cy = rect.top + rect.height / 2;
const dist = Math.hypot(e.clientX - cx, e.clientY - cy);
if (dist < 40) {
plaque.style.opacity = Math.max(0, parseFloat(plaque.style.opacity || 1) - 0.03);
}
});
});
document.addEventListener('pointerdown', () => isBrushing = true);
document.addEventListener('pointerup', () => isBrushing = false);
Isso é o básico. A partir daí, você adiciona timer, pontuação, sons, e a progressão de níveis que mencionei antes. Em uma tarde de trabalho você tem algo funcional. Se a ideia é só usar e não desenvolver, baixe o repositório completo e abra o index.html no navegador. Não precisa de servidor, roda localmente. A única dependência é um navegador moderno com suporte a Pointer Events, o que cobre qualquer coisa lançada depois de 2018.