Tile Based Engine的设计 - 坐标变换

来源:互联网 发布:sql树形结构查询php 编辑:程序博客网 时间:2024/05/03 19:18

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

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


我是按前面的文章中推算的 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, 其中边缘部分是和四周重叠的. 如果我们的地图数据是按游戏世界坐标储存. 我们可以看到, 这 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 这两个参数将会派上用场 ;-)

文章来自:http://dev.gameres.com/Program/Abstract/Thinking/TileBaseEngine3.htm

原创粉丝点击