2009-03-12 5 views
3

Je travaille sur un jeu de téléphone portable de style roguelike fonctionnant sur une grille. Les attaques/éléments de ce jeu opèrent en ciblant les tuiles selon un modèle relatif à l'utilisateur. Le paturn est généralement par rapport à la direction que l'utilisateur vise en tant que bien, par exemple dans ce screenshot le modèlej2me - Faire pivoter la matrice de points 2D par incréments de 45 degrés

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

est de montrer par rapport à un ennemi temporaire (la boîte jaune) visant « up ».

J'ai actuellement un code simple pour faire pivoter un tableau de modèles par incréments de 90 degrés, comme vu here. Ma question est, Y at-il un moyen facile de faire pivoter un tableau de 2 points par incréments de 45 degrés, permettant à mes attaques/éléments de tirer sur la diagonale, de préférence sans utiliser de calcul en virgule flottante, car il tend à fonctionner lentement sur de nombreux téléphones donc j'entends). Ceci est probablement une question triviale pour quiconque est familier avec la programmation graphique, mais j'ai été frappé par un cas de blocage du codeur.

Mon code de rotation actuel est illustré ci-dessous. Je réalise maintenant qu'une meilleure façon de le faire serait de prendre un angle au lieu d'une "direction" et de faire tourner les points de cet angle (en rejetant des angles qui ne sont pas des multiples de 45 bien sûr).

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; 
} 
+0

Cette autre question est similaire (mais pas un doublon) et pourrait être utile: http://stackoverflow.com/questions/484573/image-rotation-algorithm –

Répondre

2

L'attaque en forme de T vous montrer serait difficile de tourner à 45 degrés - les choses ne se traduisent pas vraiment de 90 à 45.

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

alternative A: 
..... 
.##.. 
.##.. 
...o. 

alternative B: 
..#.. 
.#... 
#.#.. 
...o. 

Il pourrait facilement y en avoir d'autres pour ce motif.

Je vous recommande de créer un "motif" de 45 degrés pour correspondre à un motif de 90 degrés, puis de faire pivoter le motif de 45 degrés exactement de la même manière que vous faites pivoter vos motifs de 90 degrés.

+0

Je viens d'arriver moi-même à la même réalisation en essayant la rotation mathématique dans les autres réponses. Je vais devoir trouver une version "diagonale" des motifs qui ont besoin des deux, merci pour l'aide. – LoginError

0

sûr, rotation anti-horaire en 2D (avec x positif, y montrant en haut à droite) est juste ce (voir rotation matrix dans wikipedia)

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

pour thêta = 45 degrés, cela devient

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

(remplacer 0,7071 avec sqrt (2)/2, je suis seulement en utilisant 4 chiffres ici)

Questions connexes