Aquí podría ser tu PUBLICIDAD


j2me - Gira una matriz de 2d puntos en incrementos de 45 grados

votos
3

Estoy trabajando en un juego de teléfono estilo roguelike que funciona en una grilla. Los ataques / elementos en este juego operan atacando fichas en un patrón relativo al usuario. El parche generalmente es relativo a la dirección que el usuario está apuntando también. Por ejemplo, en esta captura de pantalla el patrón

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);

se muestra en relación con un enemigo temporal (el cuadro amarillo) con el objetivo de subir.

Actualmente tengo un código simple para rotar una matriz de patrones en incrementos de 90 grados, como se ve aquí . Mi pregunta es: ¿existe una manera fácil de rotar una matriz de 2d puntos por incrementos de 45 grados, permitiendo que mis ataques / elementos disparen en la diagonal, preferiblemente sin utilizar matemáticas de coma flotante, ya que tiende a ejecutarse lentamente en muchos teléfonos (o entonces oigo). Esta es probablemente una pregunta trivial para cualquiera que esté familiarizado con la programación de gráficos, pero me han tocado con una caja de codificador.

Mi código de rotación actual se muestra a continuación. Ahora me doy cuenta de que una mejor manera de hacerlo sería tomar un ángulo en lugar de una dirección y rotar los puntos en ese ángulo (rechazando ángulos que no son múltiplos de 45 por supuesto).

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 el 12/03/2009 a las 21:55
fuente por usuario LoginError
En otros idiomas...        العربية       

3 respuestas

votos
2

El ataque en forma de T que muestre sería difícil de girar a 45 grados; las cosas realmente no se traducen de 90 a 45.

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

alternativa A:
.....
. ## ..
. ## ..
... o.

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

Fácilmente podría haber otros para ese patrón.

Te recomiendo que crees un "Patrón" de 45 grados para que coincida con el patrón de 90 grados, luego gira el patrón de 45 grados exactamente de la misma manera que giras tus patrones de 90 grados.

Respondida el 12/03/2009 a las 10:58
fuente por usuario Bill K


Aquí podría ser tu PUBLICIDAD


votos
2

Puede usar una matriz de rotación simple para rotar cada punto: http://www.siggraph.org/education/materials/HyperGraph/modeling/mod_tran/2drota.htm

Respondida el 12/03/2009 a las 09:58
fuente por usuario wchung

votos
0

seguro, la rotación en sentido contrario a las agujas del reloj en 2D (con x positivo, y apuntando hacia arriba a la derecha) es solo esto (ver matriz de rotación en wikipedia)

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

para theta = 45 grados, esto se convierte

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

(Reemplace 0.7071 por sqrt (2) / 2, solo estoy usando 4 dígitos aquí)

Respondida el 12/03/2009 a las 10:51
fuente por usuario Jason S