此节通过通过代码简要介绍卡马克地图卷轴缓冲算法在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