怎样把所有东西都显示在窗口中,并随着玩家移动呢?
思路:玩家看到的区域称为视图,即12格高,16格宽的窗口(每格32*32像素)。先把整个地图则绘制在一个DC上,然后从这个地图DC中,截取当前视图区域的图像,绘制到窗口中。修改视图区域的坐标(横坐标增加),就实现了地图的移动。
初始化:
函数:BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
代码:
// hwindow是游戏窗口的DC句柄
hwindow=GetDC(hWnd);
// hscreen是整个地图对应的DC
hscreen=CreateCompatibleDC(hwindow);
//建立一个整个地图大小(5倍窗口宽)的空位图,选入hscreen
hmapnull=CreateCompatibleBitmap(hwindow,GAMEW*32*5,GAMEH*32);
SelectObject(hscreen,hmapnull);
显示。
函数:WndProc
代码:
case WM_PAINT:
// hwindow是游戏窗口的DC句柄
hwindow = BeginPaint(hWnd, &ps);
SelectObject(hscreen,hmapnull);
case GAME_IN:
//显示天空
bmSky.DrawRollStretch(2,2,gamemap.mapinfo.iBackBmp);
//显示背景物品
gamemap.ShowBkObj(bmMapBkObj);
//显示地图物品
gamemap.Show(bmMap);
//显示动态元素
gamemap.ShowAniObj(bmAniObj);
//显示提示信息
gamemap.ShowOther(hscreen);
//显示玩家
rmain.Draw();
break;
if(gamemap.iScreenScale)
{
//窗口大小调整功能,代码略
}
else
{
//从整个地图的DC中, 截取当前视图区域的图像,绘制到窗口
BitBlt(hwindow,0,0,GAMEW*32,GAMEH*32,hscreen,gamemap.viewx,0,SRCCOPY);
}
可以看到,视图的左上角横坐标是viewx,只需要刷新这个坐标,就实现了地图移动。
视图坐标刷新:
思路:用一个函数不停地检测,玩家角色和视图左边界的距离,超过特定值,把视图向右移。
函数:void GAMEMAP::MoveView()
代码:如果玩家坐标和视图左边界的距离大于150,移动视图。
if(rmain.xpos - viewx > 150)
{
viewx+=ROLE_STEP;
//判断视图坐标是否达到最大值(地图宽度减去一个窗口宽度)
if(viewx>(mapinfo.viewmax-1)*GAMEW*32)
viewx=(mapinfo.viewmax-1)*GAMEW*32;
}
至此,地图跟随玩家移动。每一关的地图是怎样切换的呢?且听下回分解。
附:
超级玛丽第一版源码链接:http://download.youkuaiyun.com/source/497676
超级玛丽增强版源码链接:http://download.youkuaiyun.com/source/584350