j2me - 以45度为增量旋转2d点阵列

时间:2009-03-12 20:55:48

标签: java graphics java-me

我正在开发一款在网格上运行的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;
}

3 个答案:

答案 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位数字)