2009-03-12 3 views
3

Я работаю над игрой сотового телефона в стиле рогейлей, которая работает на сетке. Атаки/предметы в этой игре действуют путем таргетинга плиток по шаблону относительно пользователя. Paturn, как правило, по отношению к направлению пользователь стремится в а, например, в этом screenshot шаблонj2me - Поверните массив из 2d точек с шагом 45 градусов

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

это показывают относительно временного противника (желтая коробка) с целью «вверх».

В настоящее время у меня есть простой код для поворота массива шаблонов на 90 градусов, как видно here. Мой вопрос: есть ли простой способ повернуть массив из 2d точек на 45 градусов, позволяя моим атакам/предметам стрелять по диагонали, предпочтительно без использования математики с плавающей запятой, поскольку она имеет тенденцию работать медленно на многих телефонах (или поэтому я слышу). Это, наверное, тривиальный вопрос для всех, кто знаком с графическим программированием, но меня поразило случай кода-блока.

Текущий код поворота показан ниже. Теперь я понимаю, что лучший способ сделать это - взять угол вместо «направления» и повернуть точки на этот угол (отклоняя углы, которые не кратно 45, конечно).

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

Этот вопрос аналогичен (но не дублируется) и может быть вам полезен: http://stackoverflow.com/questions/484573/image-rotation-algorithm –

ответ

2

Т-образная атака, которую вы показываете, будет трудно вращаться при 45 градусах - вещи на самом деле не переводятся от 90 до 45.

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

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

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

Для этого образца могут быть и другие.

Я рекомендую вам создать 45-градусный «узор», чтобы он соответствовал вам на 90 градусов, а затем поверните 45-градусный рисунок точно так же, как вы поворачиваете свои 90-градусные узоры.

+0

Я только что пришел к тому же самому, математика вращения в других ответах. Мне придётся придумать «диагональную» версию шаблонов, которые нужны обоим, спасибо за помощь. – LoginError

0

уверен, вращение против часовой стрелки в 2D (с положительными х, у, указывая на верхнем правом углу) просто так (см rotation matrix в википедии)

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

для тэта = 45 градусов, это становится

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

(замените 0.7071 на sqrt (2)/2, я использую только 4 цифры)

Смежные вопросы