此节通过通过代码简要介绍卡马克地图卷轴缓冲算法在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); }第三步,便是更新缓冲区了,更新的原理如下图
最后,根据地图的滚动方向可将一张地图拆分为4次绘制,滚动所产生的8种方向均可由这4次绘制完成其效果。
源码可在http://download.csdn.net/detail/simdanfeg/3871758处下载
参考:http://wenku.baidu.com/view/a51f0b8ca0116c175f0e48c3.html