滚动地图的算法实现
变量设置:
playerx, playery 为人物相对于完整地图左上角的坐标;
screen_wide, screen_high 为屏幕的宽和高;
xtile为屏幕上x轴上可显示的小地图个数;
ytile为屏幕上y轴上可显示的小地图个数;
tileplayerx = playerx / tile_wide 为人物所在格x轴下标;
tileplayery = playery / tile_high 为人物所在格y轴下标;
应该绘制的地图范围是:
x轴: 由 tileplayerx - xtile/2 至 tileplayerx + xtile/2;
y轴: 由 tileplayery - ytile/2 至 tileplayery + ytile/2;
当人物在屏幕正中央时,地图到屏幕的位置变化公式为:
screenx = xi * tile_wide – playerx + 0.5 * screen_wide
screeny = yi * tile_high – playery + 0.5 * screen_high
int beginx = tileplayerx - xtile/2
int endx = tileplayerx + xtile/2
int beginy = tileplayery - ytile/2
int endy = tileplayery + ytile/2
tileplayerx = playerx / tile_wide
tileplayery = playery / tile_high
for (yi = beginy; yi<endy; yi++){
for(xi = beginx; xi<endx; xi++){
int screenx = xi * tile_wide – playerx + 0.5 * screen_wide;
//屏幕上位置
int screeny = yi * tile_high – playery + 0.5 * screen_high;
int tileid = mapping_matrix[yi][xi]; //地图数据数组
blit(tillid,screenx,screeny); //自编函数,将相应地图贴到正确位置
}
}
多层次地图
将地图数据改为三维数组 第三维用来表示当前是第几张地图
不同地图里的物体移动速度不相同可以模拟远近景真实感
菱形地图
二维表示三维常用方法
int MapDraw(HDC hdc){
int i,j;
int lim=MAXSCREENX/TILEWIDE; //所需绘制地图的范围
for (i=-lim; i<lim; i++){
for (j=-lim; j<lim; j++){
int sx=MAXSCREENX/2-(TILEWIDE/2)+(i*TILEWIDE/2)-(j*TILEWIDE/2);
int sy=MAXSCREENY/2-(TILEHIGH/2)+(i*TILEHIGH/2)+(j*TILEHIGH/2);
if((sx<MAXSCREENX) && (sy<MAXSCREENY) && (sx+TILEWIDE>0)
&& (sy+TILEHIGH>0) && (playerx+i<100 && playerx+i>=0)
&& (playery+j<100 && playery+j>=0) ){ //边界判断
TransparentBlt(hdcMem,sx,sy,TILEWIDE,TILEHIGH,
hdcTiles[Data[playerx+i][playery+j]],
0,0,TILEWIDE,TILEHIGH,RGB(0,255,0)); //贴图
}
}
}
BitBlt(hdc,0,0,MAXSCREENX,MAXSCREENY,hdcMem,0,0,SRCCOPY);//画到窗口
return 0;
}