您的位置:首页 > 编程语言

游戏编程基础(五)背景地图滚动显示

2012-05-06 14:31 316 查看
在游戏过程中,背景地图需要跟着人物的移动而动态的滚动变换。C++游戏编程基础中介绍了2D游戏中常用的3种动态背景表现手法。其原理和实现技巧分析如下:

方法一:单一背景滚动

        原理是:利用一张大的背景图,在游戏的进行过程中,随着人物的移动,计算应该显示背景区域的坐标,在每次背景更新时改变显示的区域即可。

关键代码:

消息循环部分沿用GDI“游戏循环”的方式
//add by leo
HBITMAP	g_hBitmapMap;
HDC		g_mdc,g_hdc; //mdc为内存兼容DC,hdc用来存储窗口DC
HWND	g_hWnd;
DWORD	g_dwTimePre, g_dwTimeNow;//分别记录上一次绘图时间,此次绘图时间
int		g_x = 0, g_y = 0; //记录显示地图的左上角坐标

//背景绘制函数
void DrawMap(HDC hdc)
{
BitBlt(hdc, 0, 0, 640, 480, g_mdc, g_x, g_y, SRCCOPY);
//记录此次画图时间
g_dwTimePre = GetTickCount();
}
............................................................
//初始化代码
g_hdc = GetDC(hWnd);
g_mdc = CreateCompatibleDC(g_hdc);
g_hBitmapMap = (HBITMAP)LoadImage(NULL, _T("0259.bmp"), IMAGE_BITMAP,
1885, 750, LR_LOADFROMFILE);
SelectObject(g_mdc, g_hBitmapMap);
DrawMap(g_hdc);
............................................................
//消息处理函数部分代码,主要是根据按键计
//算显示的x,y值
switch (message)
{
case WM_KEYDOWN:
switch (wParam)
{
case VK_UP:
g_y -= 10;
if (g_y < 0)
{
g_y = 0;
}
break;
case VK_DOWN:
g_y += 10;
if (g_y > 375)
{
g_y = 375;
}
break;
case VK_LEFT:
g_x -= 10;
if (g_x < 0)
{
g_x = 0;
}
break;
case VK_RIGHT:
g_x += 10;
if (g_x > 990)
{
g_x = 990;
}
break;
}
break;

 

方法二:循环背景动画

循环背景动画的原理是通过不断的对背景图进行裁切于结合,然后显示在窗口上实现的一种背景循环滚动的效果。

原理图如下:



关键代码:

//add by leo
HBITMAP	g_hBitmapMap;
HDC	g_mdc,g_hdc,g_bufdc; //mdc为内存兼容DC,hdc用来存储窗口DC,bufdc为缓冲绘图
HWND	g_hWnd;
DWORD	g_dwTimePre, g_dwTimeNow;//分别记录上一次绘图时间,此次绘图时间
int	g_x = 0; //记录地图右边被截取的宽度
............................................................
void CirculationMap(HDC hdc)
{
//计算获取背景图右边并贴到内存DC中
BitBlt(g_mdc, 0, 0, g_x, 900, g_bufdc, 900 - g_x, 0, SRCCOPY);

//获取背景图左边部分并贴到内存DC中
BitBlt(g_mdc, g_x, 0, 900 - g_x, 900, g_bufdc, 0, 0, SRCCOPY);

//将内存DC贴到窗口中
BitBlt(g_hdc, 0, 0, 1200, 900, g_mdc, 0, 0, SRCCOPY);

//记录此次画图时间
g_dwTimePre = GetTickCount();

g_x += 10;
if (g_x == 900)
{
g_x = 0;
}
}
............................................................
HBITMAP bmp;
//需要用到双缓冲绘图,初始化兼容DC以及兼容位图
g_hdc = GetDC(hWnd);
g_mdc = CreateCompatibleDC(g_hdc);
g_bufdc = CreateCompatibleDC(g_hdc);
bmp = CreateCompatibleBitmap(g_hdc,1200, 900);

SelectObject(g_mdc, bmp);

g_hBitmapMap = (HBITMAP)LoadImage(NULL, _T("0554.bmp"), IMAGE_BITMAP,
1200, 900, LR_LOADFROMFILE);
SelectObject(g_bufdc, g_hBitmapMap);

CirculationMap(g_hdc);

方法三:多背景循环动画

多背景循环动画的原理与方法二的原理类似,但是由于使用多张背景,背景在远近不同的层次上实际的视觉移动速度上是不同的。因此在贴图的时候需要决定不同背景贴图的先后顺序以及滚动的速度。

比如我们的画面上有天空,山,房屋,草地,人物。那么贴图的顺序应该是:天空-》草地-》山-》房屋-》人物。而滚动的速度则应该是:天空<山<草地<=房屋。而人物则是在原地跑动,这样就可以产生人物向前奔跑的视觉效果了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐