好了,现在马上解决RPG中的第一个问题:地图。这个破烂东西纠结了我很长的时间,因为我一直都想拥有一个地图编辑器,这样游戏可以手动或者自动的定制出来,拯救我这种美工白痴。
仔细看了下SRPG的地图实现,分为底图和活动域两块。底图就是将一幅图片作为地图背景;活动域将底图按照切分成正方形瓦片后,定义每个瓦片上角色是否能活动的一个二维数组。角色在活动域中游走,相应的计算背景地图的移动,这样完成了最简单的地图实现。
明显我对这样的效果不会满意,首先一幅地图的图片并且没有改变的可能;地图中没有掩盖关系,只能是一个纯的2D地图,无法实现主流的2.5D效果;地图不能过大,否则内存溢出。
于是我盯上了一个现成的开源地图编辑器————
tiled map editor。这个使用xml表示tile图层的图像界面定义工具解决了我很多的问题,首先是一个图形用户界面拖拽完成地图定义;可以通过不同图层实现布景乃至角色的掩盖关系;而且他拥有一套生成和解析的开源代码。虽然Lgame已经对TMX地图有了支持,但是在行动域定义、地图背景和掩盖关系上并没有给出了一个解决方案。于是乎要使用自定义地图就需要自己费些事了。
首先,我们在SPRG原有地图域上增加TMX地图的支持,修改代码如下:
成功运行结果:
但是由于在每一帧中都需要按遍历所有瓦片定义合成地图,所以效率低得可怜。于是乎开始考虑优化方案,首先像到的就是将图像合成地图的过程用单独的线程运行,显示已合成完毕的纹理。当然由于地图过大必然引起内存泄漏,于是想到的是使用逐步加载的办法。如图所示,当屏幕边缘触及重构检查线(虚线),地图重构线程启动,将新的地图纹理替代老的,检查先以为的区域为重构提供了运行时间,用户不会感知重构的过程。