游戏编程基础(五)背景地图滚动显示
2012-05-06 14:31
316 查看
在游戏过程中,背景地图需要跟着人物的移动而动态的滚动变换。C++游戏编程基础中介绍了2D游戏中常用的3种动态背景表现手法。其原理和实现技巧分析如下:
方法一:单一背景滚动
原理是:利用一张大的背景图,在游戏的进行过程中,随着人物的移动,计算应该显示背景区域的坐标,在每次背景更新时改变显示的区域即可。
关键代码:
方法二:循环背景动画
循环背景动画的原理是通过不断的对背景图进行裁切于结合,然后显示在窗口上实现的一种背景循环滚动的效果。
原理图如下:
![](http://my.csdn.net/uploads/201205/06/1336313578_6866.png)
关键代码:
方法三:多背景循环动画
多背景循环动画的原理与方法二的原理类似,但是由于使用多张背景,背景在远近不同的层次上实际的视觉移动速度上是不同的。因此在贴图的时候需要决定不同背景贴图的先后顺序以及滚动的速度。
比如我们的画面上有天空,山,房屋,草地,人物。那么贴图的顺序应该是:天空-》草地-》山-》房屋-》人物。而滚动的速度则应该是:天空<山<草地<=房屋。而人物则是在原地跑动,这样就可以产生人物向前奔跑的视觉效果了。
方法一:单一背景滚动
原理是:利用一张大的背景图,在游戏的进行过程中,随着人物的移动,计算应该显示背景区域的坐标,在每次背景更新时改变显示的区域即可。
关键代码:
消息循环部分沿用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;
方法二:循环背景动画
循环背景动画的原理是通过不断的对背景图进行裁切于结合,然后显示在窗口上实现的一种背景循环滚动的效果。
原理图如下:
![](http://my.csdn.net/uploads/201205/06/1336313578_6866.png)
关键代码:
//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);
方法三:多背景循环动画
多背景循环动画的原理与方法二的原理类似,但是由于使用多张背景,背景在远近不同的层次上实际的视觉移动速度上是不同的。因此在贴图的时候需要决定不同背景贴图的先后顺序以及滚动的速度。
比如我们的画面上有天空,山,房屋,草地,人物。那么贴图的顺序应该是:天空-》草地-》山-》房屋-》人物。而滚动的速度则应该是:天空<山<草地<=房屋。而人物则是在原地跑动,这样就可以产生人物向前奔跑的视觉效果了。
相关文章推荐
- 我的游戏框架基础构建篇(cocos2dx 循环滚动地图的实现)
- 游戏背景之滚动地图背景(CCParallaxNode)的使用
- 【Cocos2d-X开发学习笔记】第26期:游戏背景之滚动地图背景(CCParallaxNode)的使用
- 游戏编程入门(21):使用滚动背景更改远景
- 【Cocos2d-X开发学习笔记】第26期:游戏背景之滚动地图背景(CCParallaxNode)的使用
- Android游戏开发指南<一>背景地图
- 【Visual C++】游戏开发笔记之十一 基础动画显示(四) 排序贴图
- 游戏编程之四 diectxdarw基础篇
- Android百度地图开发之开发第一个小应用,显示基础的地图页面
- Python:pygame游戏编程之旅七(pygame基础知识讲解1)
- 【阅读笔记之八】《DIRECTX.9.0.3D游戏开发编程基础》:Direct3D中的纹理与映射
- 【阅读笔记之十三】《DIRECTX.9.0.3D游戏开发编程基础》 网格(三)加载小汽车的XFile的demo
- Android 游戏开发之主角的移动与地图的平滑滚动(十五)
- ArcGIS RunTime Sdk +WPF 基础地图显示
- 【Visual C++】游戏开发笔记之八——基础动画显示(二)游戏循环的使用
- Cocos3.4 横版游戏制作-《KillBear》-边缘检测 地图滚动
- SQL Server 2012 T-SQL基础教程--T-SQL查询和编程的背景
- DirectX游戏编程入门——第二部分(游戏编程工具箱) ——卷动背景
- Unity实战 RTS3D即时战略游戏开发(八) HUD的使用 小地图显示
- 黑马程序员之WinForm编程基础学习笔记:页面上有一个文本框,文本框左侧和右侧各有一个按钮,点击左测按钮文本框中的文字向左循环滚动一次,点击右侧按钮文本框中的文字向右循环滚动一次。