网页功能: 加入收藏 设为首页 网站搜索  
Tile Based Engine的设计 - 坐标变换
发表日期:2007-03-28作者:[转贴] 出处:  

   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 这两个参数将会派上用场 ;-)

by codingnow.com

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 Tile Based Engine的设计 - 坐标变换
本类热点文章
  脚本系统的实现
  C++基本功和 Design Pattern系列(2) Ty..
  C++基本功和 Design Pattern系列(1) - ..
  斜45度游戏开发(提高篇)
  睱酵笴栏祘Α砞璸?? - [秈顶絞]
  斜45度游戏开发(二)
  第一次写技术文献。Collision AI
  斜视角游戏中遮挡的判断
  C语言基本功教程系列(5) - 文件, Socke..
  用rand()和srand()产生伪随机数的方法总..
  C++基本功和 Design Pattern系列(3) co..
  C语言基本功教程系列(1)
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00436