JME商业游戏进阶三 (地表层的神秘面纱2)

       此节通过通过代码简要介绍卡马克地图卷轴缓冲算法在J2me中的应用及地图滚动的形成(文中用到的片段代码均来源于yarin所写的卷轴算法)。

       1.算法原理:通过更新缓冲区的数据来达到动态改变图片绘制。

       2.工作流程:卡马克定义一个和原始地图(即通过我们的地图数据生成的地图)相等大(或略大的缓冲区)。

          第一步,初始化缓冲区的时候,像我们上节代码一样,我们要先得到该(i,j)处图片切片编号,然后将其绘制到缓冲画笔上。代码如下

	private void initBuffer() {
		int x, y, cx, cy;
		for (int i = 0; i < carTitleHeightNum; i++) { // 遍历缓冲区,其中carTitleHeightNum图片X方法切块数
			for (int j = 0; j < carTitleWidthNum; j++) {
				x = getMapX(i, j); // 得到该图片切块在图片中的X方向位置
				y = getMapY(i, j); // 得到该图片切块在图片中的Y方向位置
				cx = j * titleSize; // 缓冲区当前X方向位置
				cy = i * titleSize; // 缓冲区当前Y方向位置
				carGp.setClip(cx, cy, titleSize, titleSize);
				carGp.drawImage(mapImage, cx - x, cy - y, 0); // 将图片切块绘制到缓冲区
			}
		}
	}
        

       第二步,地图的滚动,这一步的主要实现表现在 mapOffX与mapOffY的变化上,如不使用卡马克算法,我们只需要根据这两变量的改变,也能达到同样滚动的效果。

	/**
	 * 卷轴滚动
	 * 
	 * @param x
	 *            X轴滚动
	 * @param y
	 *            Y轴滚动
	 */
	public void scroll(int x, int y) {
		x += mapOffx; 
		y += mapOffy;

		if (x < 0 || y < 0) {  
			return;
		}
		if (x > bufW) {
			mapOffx = bufW;
			return;
		}
		if (y > bufH) {
			mapOffy = bufH;
			return;
		}
		updateBuffer(x, y);
	}
        第三步,便是更新缓冲区了,更新的原理如下图

        JME商业游戏进阶三 (地表层的神秘面纱2)_第1张图片

      最后,根据地图的滚动方向可将一张地图拆分为4次绘制,滚动所产生的8种方向均可由这4次绘制完成其效果。

      源码可在http://download.csdn.net/detail/simdanfeg/3871758处下载

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

                

你可能感兴趣的:(游戏,算法,工作,j2me,scroll)