
一直想把龙之崛起重置了看了一段时间Godot的TileMapLayer, 用龙之崛起的美术素材有大有小一直不知道怎么才用得起来后来想想是不是进入了一个误区干脆不用ISOmetric的瓦块地图。直接就把每一个游戏对象按坐标显示在屏幕上就行。显示在屏幕上必须使用屏幕坐标所以还是需要游戏坐标和屏幕坐标的转换。游戏坐标总是我们自己可以理解和计算的X和Y轴转换就是按45度坐标转一下吧。public static Point RotatePoint(double angle, Point origin) { Point point new Point(0, 0); double radian angle * Math.PI / 180.0; // 将角度转换为弧度 double cosTheta Math.Cos(radian); double sinTheta Math.Sin(radian); // 计算旋转后的点坐标 double newX (point.X - origin.X) * cosTheta - (point.Y - origin.Y) * sinTheta origin.X; double newY (point.X - origin.X) * sinTheta (point.Y - origin.Y) * cosTheta origin.Y; point.X (int)newX; point.Y (int)newY; return (new Point((int)newX, (int)newY)); }这段代码的作用是将一个点绕某个原点旋转指定角度并返回旋转后的新点坐标。下面逐行解释1. public static Point RotatePoint(double angle, Point origin)定义一个静态方法参数为旋转角度angle单位为度和旋转中心点origin。2. Point point new Point(0, 0);创建一个点初始坐标为 (0, 0)。注意这里始终是原点如果想旋转其他点需要传入该点。3. double radian angle * Math.PI / 180.0;将角度转换为弧度因为三角函数需要弧度。4. double cosTheta Math.Cos(radian);计算余弦值。5. double sinTheta Math.Sin(radian);计算正弦值。6. 这是二维平面上绕某点旋转的标准公式。• 先将点平移到以 origin 为原点• 进行旋转• 再平移回去7. point.X (int)newX; point.Y (int)newY;将计算结果赋值给 point。8. return (new Point((int)newX, (int)newY));返回旋转后的新点。注意• 这段代码始终旋转 (0,0) 点如果你想旋转任意点需要把 point 作为参数传入。• 旋转角度为正时按数学正方向逆时针旋转。如果按屏幕中心旋转可能还需要指定一个屏幕中心的坐标。public static Point RotatePoint(double angle, Point origin) { Point point new Point(400, 400); double radian angle * Math.PI / 180.0; // 将角度转换为弧度 double cosTheta Math.Cos(radian); double sinTheta Math.Sin(radian); // 计算旋转后的点坐标 double newX (point.X - origin.X) * cosTheta - (point.Y - origin.Y) * sinTheta origin.X; double newY (point.X - origin.X) * sinTheta (point.Y - origin.Y) * cosTheta origin.Y; point.X (int)newX; point.Y (int)newY; return (new Point((int)newX, (int)newY)); }如果屏幕是800*800指定按400*400为中心来旋转当游戏坐标为400原点时旋转后的坐标也应该是400400因为400*400是圆心。所以图片上两个坐标重合了。