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
- Tile Based Engine的设计 - 坐标变换
- Tile Based Engine的设计 - 坐标变换
- Tile Based Engine的设计 - 遮挡处理
- Tile Based Engine的设计 - Tile形状的选取
- Tile Based Engine 中的墙壁自动拼接处理
- Tile-Based架构下的性能调校
- (转)Performance Tunning for Tile-Based Architecture Tile-Based架构下的性能调校
- Performance Tunning for Tile-Based Architecture(Tile-Based架构下的性能调校)
- Performance Tunning for Tile-Based Architecture Tile-Based架构下的性能调校
- 坐标变换的实现
- 矩阵的坐标变换
- 图像的坐标变换
- 摄像机的坐标变换
- OpenGL的坐标变换
- Tile-Based Deferred Rendering(TBDR)
- Svg下的坐标变换
- 空间数据的坐标变换
- 坐标变换后的三角形
- 关于VC++中,两种自定义消息的发送与接收的方法实现进行说明。
- 分布式数据库系统
- Tile Based Engine的设计 - Tile形状的选取
- CSS核心--盒子模型
- 非常有用的Java日期时间操作函数代码一览
- Tile Based Engine的设计 - 坐标变换
- .net C#的常用数据库连接
- 宏函数和普通函数的区别
- 有点迷茫。。。
- Internet Explorer无法打开internet站点,已终止操作的解决方法合集
- 又是一个好天气啊!
- WebConfig 详解
- ABAP实现穷举期间范围内相邻月份排列组合
- Tile Based Engine的设计 - 遮挡处理