卡马克卷轴算法实现android版

相关资料

雨松MOMO带你走进游戏开发的世界之主角的移动与地图的平滑滚动

http://blog.csdn.net/xys289187120/article/details/6649274

卡马克卷轴算法研究_地图双缓冲

http://wenku.baidu.com/view/a51f0b8ca0116c175f0e48c3.html

矩形相交判断

http://hi.baidu.com/jiyeqian/blog/item/c14e52c24794b4170ff47715.html


实现原理

将地图每次移动时的相交区域作为重复利用资源(缓冲区),如图a1b1c1d1(移动前)和a2b2c2d2(移动后)相交得到的矩形为aabbccdd。


根据判断矩形是否相交公式为:

通过中心点距离判断(中心点距离 X<= 矩形1宽度/2 + 矩形2宽度/2)且(中心点距离 Y<= 矩形1高度/2 + 矩形2高度/2)

获取相交矩形公式为:

如果相交,则相交矩形的左上角坐标为(max(a1.x,a2.x),max(a1.y,a2.y))和右下角坐标(min(d1.x,d2.x),min(d1.y,d2.y))

当每次屏幕移动时,实际是将地图移动在相反的方向移动,移动后根据当前屏幕所在地图中的相对位置,将屏幕中的区域贴砖。在每次移动中实际不同的区域只是非AaBbCcDd相交区域,所以可以在贴砖时增加判断当前贴砖区域是否是在相交区域,如果是则不用贴砖,只把相交区域外的区域进行贴砖即可,实际就是少贴砖,减少CPU的运算量。

注意采用该算法后,占用内寸不会减少,由于卡马克卷轴涉及到很多坐标运算,所以在当前内存消耗中,有时候会多占用一些内存资源。


具体实现代码如下:

/**
	 * 滚动屏幕(移动距离可以利用onTouchEvent获得)
	 * @param distanceX X方向移动距离
	 * @param distanceY Y方向移动距离 
	 */
	public void scrollMap(float distanceX, float distanceY) {
		// TODO Auto-generated method stub
		//触摸位移灵敏度
		int newScrLeft = screenInMapLoc.x + (int)distanceX/5;
		int newScrTop = screenInMapLoc.y + (int)distanceY/5;
		
		int mapWidth = mMapView[0].length * TILE_WIDTH;
		int mapHeight = mMapView.length * TILE_HEIGHT;
		
		//设置后则是考虑相交区域
		lastScrInMapLoc = new Point(screenInMapLoc.x,screenInMapLoc.y);

		if(newScrLeft>0 && newScrLeft + SCREEN_WIDTH0 && newScrTop + SCREEN_HEIGHT

结论

 在模拟器中未使用卡马克卷轴算法:


在模拟器中使用卡马克卷轴算法:


采用卡马克卷轴算法后,CPU执行耗时有明显减少。


实现代码:

点击下载

你可能感兴趣的:(android,游戏开发)