我有一个基于图块的项目游戏,使用多个图块层获得了很好的伪3D效果,但我希望能够旋转相机(基本上是旋转精灵)。
但是,简单地旋转精灵并不等于旋转世界,对吗?
由此,我得到:
x = (x - y) * (tile_width/2);
y = (x + y) * (tile_width/2);
但是,看到了吗?这只适用于45度旋转瓷砖!如何修改这些公式中使用的角度(或者更好,更合适的角度)?
答案 0 :(得分:3)
旋转精灵只是旋转世界/相机的一部分。
要旋转世界/相机,每个瓷砖需要沿弧线移动,并同时旋转。要做到这一点,你需要使用极坐标。计算从旋转中心到每个瓷砖中心的距离和角度。然后将所需的旋转角度添加到每个图块的极角。通过转换回笛卡尔坐标来计算切片中心的新x
和y
值。
以下是代码的外观,假设每个tile都由一个struct表示,并且该struct具有tile中心的原始x
和y
坐标(即坐标)当世界不旋转时,瓷砖的中心。)
// compute the distance from the center of the tile to the center of rotation
double dx = tile[t].x - centerOfRotation.x;
double dy = tile[t].y - centerOfRotation.y;
// compute the new location of tile in polar coordinates relative to the center of rotation
double r = sqrt(dx*dx + dy*dy);
double angle = atan2(dy, dx) + angleOfRotation;
// compute the display location for the tile
x = centerOfRotation.x + r * cos(angle);
y = centerOfRotation.y + r * sin(angle);
// note that the tile itself needs to rotated as well, using angleOfRotation
// also, all angles are in radians
尝试旋转图形时,有助于简化操作。使用少量瓷砖,使瓷砖具有强烈边框的不同颜色,以及用于显示方向的识别标记。这是一个示例,在初始方向上有9个瓷砖,逆时针旋转30度。
以下是一些可能出错的例子:
1)移动瓷砖而不旋转瓷砖
2)旋转瓷砖而不移动瓷砖
3)顺时针旋转瓷砖,同时逆时针移动瓷砖
底线:几乎任何错误都会导致图像有间隙。