卡马克卷轴算法的引入
上面的算法虽然在一定程度上解决了地图绘制的效率问题,但对于某些资源严重不足的手机,或者由于地图块比较小、循环次数过多的情况,仍然会造成画图时屏幕闪烁。因此,在这种情况下,仍然需要对上述算法做进一步的优化。
不论采用哪种优化算法,一个基本的思路就是尽量减少绘制的次数,从而减少对系统资源的消耗。卡马克卷轴算法就是这样算法的一个经典例子。
单方向卷轴
对于横版游戏来说,如果角色向右侧移动,则地图向左侧滚动。由于角色每次移动若干个步长,因此地图中新画出的区域宽度也为若干个像素,那么如果让系统重绘所有屏幕区域,很明显,大部分区域都是和上一屏幕区域相同的,如此造成成了资源的浪费。而卡马克算法的思路就是——如果上一次绘制过的地图也能够部分重用到本次地图绘制上来就好了。那么很容易想到在内存中建立一个和屏幕一样大或略大的缓冲区即可很好的完成这个设想。
由上图可以看到,区域B为相同的地图区域,这个区域在下一次屏幕重绘时,可以被重新利用。区域A是在下一次屏幕重绘中不被采用的区域,这区域应当被舍弃,但是如果稍微留意一下的话,不难发现区域A和区域C的面积大小其实居然是一样的。
那么如果建立一个和屏幕大小相同的缓冲,在其被舍弃掉的绘制区域A中画上新的区域C,再把区域B和区域C拼合到屏幕上,是不是就能达到减少系统资源消耗的目的了呢?卡马克卷轴的基本原理正是如此。
图显示了卡马克卷轴的最基本原理,首先在内存中建立一块和屏幕一样大小(或略大)的缓冲区。然后在本应由于地图移动而被舍弃掉的区域1上面绘制,由于地图滚动而出现的新地图区域。最后把两个区域按照地图的实际位置拼合到屏幕上。
双轴滚动的卡马克卷轴
对于俯视游戏,或者有Y轴卷动的游戏来说,单单一个方向的地图卷动并不够用。那么如果是出现两个方向的卷动会如何呢。不必担心,上面的思路算法一样能适应这种情况。
由上图可以看到,区域D为相同的地图区域,这个区域在下一次屏幕重绘时,可以被重新利用。区域ABC是在下一次屏幕重绘中不被采用的区域,可以在这个3个区域上绘制上下一次需要重绘的区域A’B’C’。再将绘制好的四个区域拼合到屏幕的对应位置。
上图显示了双轴滚动的卡马克卷轴的基本绘制原理,需要特别注意的是:在缓冲区的绘制顺序和在屏幕上拼合的顺序是完全相反的。
卡马克算法的实现
卡马克卷轴缓冲画法的一般步骤如下:
1. 初始化所有地图数据,并且全屏绘制初始的地图
2. 若人物移动,则调用摄像机算法,修正地图偏移量
3. 地图偏移量不满足地图的边界条件,就重绘缓冲区
4. 重绘缓冲区
5. 后台缓冲区的四个子区按照顺序画到屏幕上
摘自:http://bbs.chinaunix.net/thread-1669931-1-1.html
分享到:
相关推荐
卡马克算法android版本底层封装(使用android游戏开发中地图基于Title块的绘制)
J2ME地图优化算法。 卡马克卷轴算法。 RPG地图优化。
卡马克算法源码绝对物有所值对初学者很有帮助
游戏地图绘制的经典算法卡马克 卡马克算法 经典 详细 游戏地图绘制中的常用算法 值的研究的算法
卡马克相信大家都知道,这最好的地图绘制算法,里面有代码和效果演示。
flash 卡马克算法地图或是图片加载时候减少加载资源,降低内存
卡马克卷轴算法android版,游戏开发,地图滚动算法优化
卡马克地图算法,用在RPG地图绘制中非常的广泛,有兴趣的可以下下来看看研究。
This is the complete source code for winquake, glquake, quakeworld, and glquakeworld. The projects have been tested with visual C++ 6.0, but masm is also required to build the assembly language ...
1.5卡马克卷轴算法的引入 8 二、卡马克卷轴算法原理 9 2.1X|Y单轴滚动的卡马克卷轴 9 2.2X&Y双轴滚动的卡马克卷轴 10 三、卡马克卷轴的代码实现方法 12 3.1问题简化与算法步骤 12 3.2类CarMapBuffer设计 12 3.3步骤...
arduino kalam滤波算法
flash actionscript3游戏开发之 AS3中实现卡马克卷轴算法(横版过关游戏).zip
Flash中实现卡马克卷轴算法.doc
卡马克卷轴算法研究_地图双缓冲.doc
对于J2ME框架下的手机游戏程序的开发,其地图滚动的重绘有多种算法,由于手机性能的限制和开发周期等其他非技术条件,需要根据情况灵活选择所需的技术。但在及其苛刻条件下,如系统CPU资源不足,地图块尺寸较小等,...
给点辛苦分吧!我上传的资源都是我写的程序,这个使用起来很方便,只需填写你的地图TITLE的大小就可以,如果有使用问题,可以到我BLOG留言讨论!
NULL 博文链接:https://2528.iteye.com/blog/792164
内含A星算法,卡马克卷轴算法,以及一些gameloft数学算法。以及一些A星算法的实例代码。数学算法内包含: 定点数算法,距离的计算(点到点距离、点到线距离、),三角函数算法、碰撞和剪裁算法,平方根,队列,排序...
改动的JME卡马克地图缓冲卷轴算法源代码,其中最有意思的CarmackMapBuffer类已被别人封装好,我只是借花献佛将它贡献出来
安卓平台下用卡马克地图缓冲算法实现大图无损浏览。