Bresenham
Antigamente, quando as pessoas ainda escreviam suas próprias rotinas básicas de vídeo para desenhar linhas e círculos, não era incomum usar o algoritmo de linha de Bresenham para isso.
Bresenham resolve esse problema: você deseja desenhar uma linha na tela que mova os dx
pixels na direção horizontal e ao mesmo tempo estenda os dy
pixels na direção vertical. Existe um caractere "flutuante" inerente às linhas; mesmo se você tiver pixels inteiros, você acaba com inclinações racionais.
O algoritmo precisa ser rápido, o que significa que ele pode usar apenas aritmética inteira; e também foge sem multiplicação ou divisão, apenas adição e subtração.
Você pode adaptar isso para o seu caso:
- Sua "direção x" (em termos do algoritmo de Bresenham) é o seu relógio.
- Sua "direção y" é o valor que você deseja incrementar (ou seja, a posição do seu personagem - cuidado, este não é realmente o "y" do seu sprite ou o que quer que seja na tela, mais um valor abstrato)
"x / y" aqui não é o local na tela, mas o valor de uma de suas dimensões no tempo. Obviamente, se o seu sprite estiver sendo executado em uma direção arbitrária na tela, você terá vários Bresenhams executando separadamente, 2 para 2D, 3 para 3D.
Exemplo
Digamos que você queira mover seu personagem em um movimento simples de 0 a 25 ao longo de um dos seus eixos. Como está se movendo com a velocidade 2.5, ele chegará lá no quadro 10.
É o mesmo que "desenhar uma linha" de (0,0) a (10,25). Pegue o algoritmo de linha de Bresenham e deixe correr. Se você fizer o que é certo (e quando estudá-lo, rapidamente ficará claro como o faz), gerará 11 "pontos" para você (0,0), (1,2), (2, 5), (3,7), (4,10) ... (10,25).
Dicas sobre adaptação
Se você pesquisar esse algoritmo no Google e encontrar algum código (a Wikipedia possui um tratado bastante grande), há algumas coisas que você precisa observar:
- Obviamente, funciona para todos os tipos de
dx
e dy
. Você está interessado em um caso específico (por exemplo, você nunca terá dx=0
).
- A implementação de costume terá vários casos diferentes para os quadrantes da tela, dependendo se
dx
e dy
são positivos, negativos, e também se abs(dx)>abs(dy)
ou não. É claro que você também escolhe o que precisa aqui. Você deve ter certeza de que a direção que é aumentada a 1
cada escala é sempre a direção do "relógio".
Se você aplicar essas simplificações, o resultado será muito simples e se livrará completamente de quaisquer reais.