J2ME - Rodar matriz de pontos em 2D, em incrementos de 45 graus

votos
3

Eu estou trabalhando em um jogo de celular estilo roguelike que opera em uma grade. Ataques / Itens neste jogo de operar, visando telhas em um padrão em relação ao usuário. O paturn é normalmente em relação à direcção do utilizador tendo em vista, bem como, Por exemplo, na presente imagem do padrão

Point2d[] damageTiles = new Point2d[4];

damageTiles[0] = new Point2d(0, -1);
damageTiles[1] = new Point2d(0, -2);
damageTiles[2] = new Point2d(1, -2);
damageTiles[3] = new Point2d(-1, -2);

é mostrar em relação a um inimigo temporária (caixa amarela) visando up.

Atualmente tenho código simples para girar uma matriz padrão por incrementos de 90 graus, como visto aqui . Minha pergunta é: Existe uma maneira fácil de girar uma matriz de pontos 2D em incrementos de 45 graus, permitindo que meus ataques / itens para disparar na diagonal, de preferência sem usar matemática de ponto flutuante, pois ele tende a funcionar lentamente em muitos celulares (ou assim que eu ouvi). Esta é provavelmente uma pergunta trivial para qualquer pessoa familiarizada com programação gráfica, mas eu fui atingido com um caso de coder's-bloco.

Meu código de rotação atual é mostrado abaixo. Agora percebo que a melhor maneira de fazer isso seria a de tomar um ângulo em vez de uma direção e girar os pontos por esse ângulo (rejeitando ângulos que não são múltiplos de 45, claro).

private Point2d[] rotateList(Point2d[] points, int direction) {
    for (int i = 0; i < points.length; i++) {

        if (direction == ROTATE_LEFT) {
            int temp = points[i].x;
            points[i].x = points[i].y;
            points[i].y = -1 * temp;
        }
        else if (direction == ROTATE_RIGHT) {
            int temp = points[i].x;
            points[i].x = -1 * points[i].y;
            points[i].y = temp;
        }

    }

    return points;
}
Publicado 12/03/2009 em 21:55
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

O ataque em forma de T você mostrar seria difícil para girar em 45 graus - as coisas realmente não traduzir 90-45.

original:
.....
. ###.
.. # ..
..o ..

Uma alternativa:
.....
. ## ..
. ## ..
... o.

alternativa B:
.. # ..
. # ...
#. # ..
... o.

Não poderia ser facilmente outros para esse padrão.

Eu recomendo que você criar um "padrão" de 45 graus para combiná-lo 90 graus padrão, em seguida, gire o padrão de 45 graus exatamente da mesma maneira que você gire seus 90 padrões graus.

Respondeu 12/03/2009 em 22:58
fonte usuário

votos
2

Você pode usar uma matriz de rotação simples para girar cada ponto: http://www.siggraph.org/education/materials/HyperGraph/modeling/mod_tran/2drota.htm

Respondeu 12/03/2009 em 21:58
fonte usuário

votos
0

certeza, rotação anti-horária em 2D (com x positivos, y apontando para cima à direita) é apenas isso (ver matriz de rotação na wikipedia)

[x']   [cos(theta)  -sin(theta)] [x]
[y'] = [sin(theta)   cos(theta)] [y]

para teta = 45 graus, isto torna-se

 x' = 0.7071*x - 0.7071*y
 y' = 0.7071*x + 0.7071*y

(Substitua 0,7071 com sqrt (2) / 2, eu só estou usando 4 dígitos aqui)

Respondeu 12/03/2009 em 22:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more