坐标变换:Tile Based Engine的设计 - 坐标变换

  Isometric Tile处理比矩形稍微复杂地方在于屏幕是矩形, 而反映出来游戏世界坐标轴有些区别. 无论是精灵移动, 还是处理 Tile 都需要经过坐标变换. 而个屏幕区域在游戏世界地图上却成了个菱形. 我想,所有第次设计 Isometric Tile 引擎员都为这个烦躁过 (自己感受啦;-) 不排除这个原因修改自己原始设计可能性 ^_^.

   实际它点也不复杂,但需要你静下心来用直尺在白纸上画张示意图. (注意:如果你贪图便宜,而随手用铅笔比画,只会使你心情更烦躁) 或者按云风习惯用C来作图(推荐使用风魂 等方便图形库;-) 当然你 AutoCAD 玩话, 用 ADS 也非常方便. 这些思路方法不只针对这个特定问题, 我想每个员都应该养成这些良好习惯 ;-) 这里云风为你做了这步.
看下图:
\" width=410 border=0>

我是按前面文章中推算 Tile 形状, 和每个地图块大小来作 1:1 示意图. 绿色框住是 320x240 1/4 屏幕大小地图块. Tile 大小设定为 81x41 由于 Tile 间有 1 点重叠, 所以实际占空间是 80x40 . 另外我将左上角块 Tile 设定为 (0,0) 其它 Tile 按相对坐标编了坐标值, 方便大家观看.

   如图,由于 Tile 大小比较合理, 正好可以在个地图块中容纳整数个 Tile, 所以我们坐标变换就非常容易了.按图中所标相对坐标, 左上角块为 (0,0). 那么我们将相对坐标 (x,y) Tile 变换为地图块上像素坐标为(40*(y-x),20*(x+y))

   个地图块里, 包含了 59 个 Tile, 其中边缘部分是和 4周重叠. 如果我们地图数据是按游戏世界坐标储存. 我们可以看到, 这 59 个 Tile X 范围是 [-4,6] Y 范围是 [-1,9]. 就是说我们至少需要读入游戏世界中个 11x11 地图描述矩阵才能包含这个地图块数据. 这里, 我建议游戏地图描述数据用 16x16 做块保存. 在加载几个地图块图象数据同时, 我们也可以将相应地图描述数据范围计算出来, 分块加载到内存.

   两个坐标换算在解决区别问题中, 可能有些麻烦, 但我们只需要记住两条基本公式. 游戏世界中坐标(X,Y)换算到屏幕矩形坐标系(X0,Y0)中是 X0=a*(Y-X),Y0=b*(X+Y) 而反向转换可以推算出来是 X=(1/2)*(Y0*2-X0)/a, Y=(1/2)*(Y0*2+X0)/a. 在计算除法时候, 应该注意正负号问题. (-1/7 取整在这里应该是 -1 而不是 0) 这里 a,b 是矩形长宽系数, 比如在前面提到换算公式中用到 a=40,b=20 就是 Tile 长(80)宽(40) 半. 同样你要对地图块进行某种运算时候; 4 和 6 这两个参数将会派上用场 ;-)
Tags:  坐标变换公式 坐标变换矩阵 三维坐标变换 坐标变换

延伸阅读

最新评论

发表评论