我正在开发一款在网格上运行的roguelike风格手机游戏。此游戏中的攻击/项目通过以相对于用户的模式定位切片来进行操作。 paturn通常也与用户瞄准的方向有关,例如在screenshot模式中
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 :(得分:2)
您可以使用简单的旋转矩阵来旋转每个点: http://www.siggraph.org/education/materials/HyperGraph/modeling/mod_tran/2drota.htm
答案 1 :(得分:2)
你展示的T形攻击难以在45度旋转 - 事情并没有真正从90度转换为45度。
original: ..... .###. ..#.. ..o.. alternative A: ..... .##.. .##.. ...o. alternative B: ..#.. .#... #.#.. ...o.
这种模式很容易有其他人。
我建议您创建一个45度“图案”以匹配您的90度图案,然后旋转45度图案,就像旋转90度图案一样。
答案 2 :(得分:0)
当然,在2D中逆时针旋转(正x,y指向右上角)就是这样(请参阅维基百科中的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
(用sqrt(2)/ 2替换0.7071,我这里只使用4位数字)