在缓冲区绘制地图时,如果基于tile变换地图速度太快,FPS不好控制,可以先绘制比屏幕大小高和宽一个相素,缓冲区反转屏幕时,屏幕由相素坐标控制地图显示,其实就是多出那个一个tile的相素变换,由屏幕外逐渐绘制到屏幕内,可以在屏幕绘制时采取记数器,但是记数器的边界一定要设置正确,否则地图会斗(犯过这样的毛病,特别注意),等技术器到达边界再更新缓冲区。
因为缓冲区不必每真都绘制,它里面是根据tile绘制的,可以每次更新一行,也可以每次更新几行。也可以先把地图整个绘制在缓冲区,然后屏幕绘制操作相素,但是这样比较浪费内存,不过只绘制一次缓冲区 看情况使用。
public void drawMap(Graphics g) {
if (!isInit) {
initMap(tileFileName);
}
Index = startmapIndex;
if (pixCount == 0) { //查看缓冲区是否需要更新
for (int j = 0; j < 9; j++) { //行
for (int i = 0; i < 8; i++) { //列
bg.setClip(mCx, mCy, tileW, tileH); //设置绘制tile区域
//通过地图索引取得tileModX,tileModY
getDispMentFromTileset(mapIndex[Index]);
System.out.println("mapIndex[" + Index + "]=" +
mapIndex[Index]);
bg.drawImage(tileImage, mCx - tileModX, mCy - tileModY,
bg.TOP | bg.LEFT);
mCx += tileW;
if (mCx == Def.SCREEN_HEIGHT) { //边界判定
mCx = 0;
}
if (Index < startmapIndex + 71) {
Index++;
} else {
Index = 0;
}
}
mCy += tileH;
if (mCy == Def.SCREEN_HEIGHT + tileH) { //边界判定
mCy = 0;
}
}
if (startmapIndex <= 0) { //判定地图边界,地图象下移动
startmapIndex = 56;
// startmapIndex = 9;
} else {
startmapIndex -= 8;
}
}
System.out.println("startmapIndex=" + startmapIndex);
bg.setClip(0, 0, Def.SCREEN_WIDTH, Def.SCREEN_HEIGHT); //恢复全屏设置区域
filpMapBuff(g, screenBuf);
}
/**
*@todo filp内存地图
*/
int pixCount = 0; //进行几次相素移动
int sx = 0;
int sy = -16;
public void filpMapBuff(Graphics g, Image buff) {
if (buff == null) {
return;
}
g.drawImage(buff, sx, sy, g.TOP | g.LEFT);
sy += 2;
if (sy == 0) {
sy = -tileH;
}
if (pixCount < 7) {
pixCount++;
} else {
pixCount = 0;
}
}
这段代码是我做一个STG商业代码中截取出来的,比较典型的tile缓冲处理方式
转自:http://www.j2megame.org/index.php/content/view/1888/125.html