|
|
寒假闲暇时间,很无聊,正好群里面有人喊我做个游戏玩玩.写了好几年的程序了,还真没有写过游戏,第一次写游戏,不要对自己要求很高,C#+GDI+也就凑合了,不准备用C++和DirectX了,而且接口设计的好的话,更换图象模块也不是很困难的.说是用GDI+,其实主要也是使用了GDI+中的DrawImage函数,整个游戏的动画显示和精灵活动都是自己写的.半个月的奋斗,游戏终于有了个雏形,只剩下一些细微的地方需要调节,一路过来,有些感想,在这里抒发一下,方法也许不成熟,希望大家不要见笑.
也许会写一系列的文章,但是又不一定,看心情和时间了,下学期也许还得找工作,心情有点烦.
这篇文章讲的坐标系问题其实是开发到了中期在进行临界值调整的时候发现的一个问题,看起来很小的问题,但是处理起来还真是有点头晕.
在游戏中可能存在的坐标系如图一:

其中需要解释的是,整个游戏使用2套坐标映射的规则,即游戏逻辑坐标和屏幕坐标,全地图坐标系是将整个地图按照32*32的Tile初始化而成的一个二维数组Map[][].
第一个被我注意到的,也是困扰了我很久的问题是,对于同一个二维矢量索引<a,b>,
用它来索引一个二维数组和索引屏幕坐标时是相反的,例如,Map[a]索引的是Map中第a行第b个元素,但是对于屏幕坐标系的话(a*32,b*32)索引的却是第b*32行第a*32个象素.这个事实不实际开发的话很容易被忽略掉.这个事实只要注意到了,修正起来并不困难.但是其中涉及到一个设计问题,即在整个游戏的组成中,哪些类使用游戏逻辑坐标系,哪些类使用屏幕的象素坐标系.在多次尝试以后,发现了一个理所当然的划分:涉及到实际往屏幕上输出象素的显示模块中的类使用屏幕坐标系,并最好在设计和代码中用醒目的字体明显的指出这个类使用的是屏幕坐标系;其它所有的类都使用游戏逻辑坐标系.千万不可以在设计类的时候,为了图方便,按照类的特性在多个类之间游戏逻辑坐标系和屏幕坐标系混用,否则代码量和类多了以后,会陷入坐标地狱的.
第二个问题,坐标系多了起来,进行坐标计算的时候就有很多繁杂的地方,下面列出几个比较常用计算公式:
NowMan.Position 当前人物的坐标(游戏逻辑坐标,全地图坐标系)
NowMan.YiDongLi 当前人物的移动力(游戏逻辑坐标)
Map.NowLt 当前地图可显示区域的左上角坐标(游戏逻辑坐标,全地图坐标系)
Mouse.Position 鼠标的当前位置(屏幕坐标,可见区域坐标系)
鼠标点击时所处的位置在各个坐标系中的确定:
(即采用屏幕坐标的可见区域坐标系到各个采用游戏逻辑坐标的各个坐标系的映射公式)
全地图坐标系:
TileX=( Mouse.Position.Y) / 32+ Map.NowLt.X
TileY=( Mouse.Position.X) / 32+ Map.NowLt.Y
可显示区域坐标系:
TileX=( Mouse.Position.Y) / 32
TileY=( Mouse.Position.X) / 32
XX范围计算坐标系(以移动范围计算坐标系为例)
TileX=( Mouse.Position.Y) / 32+Map.NowLt.X-NowMan.Position.X +NowMan.YiDongLi
TileY=( Mouse.Position.X) / 32+Map.NowLt.Y-NowMan.Position.Y + NowMan.YiDongLi
人物所处位置在各个坐标系中的确定:
(即全地图坐标系到其它各个坐标系的映射公式)
全地图坐标系:
TileX=NowMan.Position.X
TileY=NowMan.Position.Y
可显示区域坐标系:
TileX=NowMan.Position.X-Map.NowLt.X
TileY=NowMan.Position.Y-Map.NowLt.Y
XX范围计算坐标系(以移动范围计算坐标系为例)
TileX=NowMan.YiDongLi
TileY=NowMan.YiDongLi
XX范围计算坐标系(以移动范围计算坐标系为例)到其他坐标系的映射)
(需要转换的当前XX范围计算坐标系中的坐标为<n,m>)
全地图坐标系:
TileX= NowMan.Position.X + n - NowMan.YiDongLi
TileY= NowMan.Position.Y + m - NowMan.YiDongLi
可见区域坐标系:
TileX= NowMan.Position.X - Map.NowLt.X + n - NowMan.YiDongLi
TileY= NowMan.Position.Y - Map.NowLt.Y + m - NowMan.YiDongLi
XX范围计算坐标系(以移动范围计算坐标系为例)
TileX=n
TileY=m
写的不是很严谨,希望大家多包涵,有问题的话可以写信交流,onlyxuyang@163.com,谢谢. |
|