VC++游戏开发1------利用图片拼接实现内存中构建游戏地图,许多游戏编辑器的原理。...

此文章由yuedongwei521编写 ,转载请说明出处,本人现在正在学习 C++游戏开发有兴趣的 462264505@qq.com Q我一起交流. 源码我们放在下面供大家下载。

不罗嗦下面开始游戏开发之路...

在我们进行游戏开发的时候,我们往往需要地图 , 这时候我们可能会想到通过加载整张位图的方式来进行地图的实现 。的确这样可以实现 ,在小型的游戏中可以这样做 ,但是在大型游戏中这样是不可取的 。想想看 大量的位图资源如果一张一张的加载 其资源的消耗是很可观的,这时候我们就需要进行地图拼接 。

地图拼接是什么概念呢? 就是比如下面一张图片 ,一张图片包含了不同的内容 30*90大小 ,我们仅仅夹在了一张图片就实现了地图的拼接。

我们就可以利用这一张图片实现如下面的地图:当然我这里是进行测试 实际中 大家可以自己使用自己的资源 :

涉及到的WIN32函数

BitBlt 、 CreateCompatibleDC 、 CreateComtibleBitmap 主心骨仅仅这三个API而已。

废话不多说看代码 :

#include "windows.h" #include "tchar.h" HWND mapWnd ; //窗体句柄 HINSTANCE ist ; //实例句柄 HBITMAP bitmap; //我们的地图资源 HDC wndDC ; //窗口的DC void PaintMap(HDC dc,HBITMAP bitmap) ; //绘制地图的函数 重点。。。看这个 这个函数是实现的关键 BOOL InitInstance(HINSTANCE hist) ; ///初始化函数 LRESULT CALLBACK MapProc( HWND hwnd,UINT uMsg,WPARAM wParam, LPARAM lParam ); //窗口过程 ATOM MyRegisterClassEx(HINSTANCE hist) ; //注册窗口类 BOOL InitInstance(HINSTANCE hist) { HWND wnd ; wnd=::CreateWindow(_T("MapWindow"),_T("map"),WS_OVERLAPPEDWINDOW,100,80,315,337,NULL,NULL,hist,0) ; wndDC=GetDC(wnd) ; ShowWindow(wnd,SW_SHOWNORMAL) ; UpdateWindow(wnd) ; bitmap=(HBITMAP)LoadImage(hist,_T("map.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ; //加载地图资源 PaintMap(wndDC,bitmap) ; return TRUE ; } void PaintMap(HDC dc,HBITMAP bitmap) //dc是窗体DC bitmap是加载的地图位图句柄 { HDC mdc1=CreateCompatibleDC(dc) ; // 创建一个和窗体DC兼容的内存DC , 将后面创建的兼容位图选进来 HDC mdc2=CreateCompatibleDC(dc) ; //创建一个和窗体兼容的内存DC,并将外部地图图片选进来 HBITMAP mbitmap=CreateCompatibleBitmap(dc,300,300) ; //兼容位图 ,用来在内存中构建地图 SelectObject(mdc1,mbitmap) ; //选择兼容位图 SelectObject(mdc2,bitmap) ; //将图片选入兼容mdc2 int map[10*10]={ 0,1,1,2,1,2,1,0,0,0, //位图数据 0 1 2分别代表了 地图位图资源三部分的代号。 1,1,0,1,0,2,0,1,1,2, 2,1,0,1,0,2,0,1,0,2, 1,1,1,2,1,2,1,0,1,0, 0,1,1,2,1,2,1,0,2,0, 2,1,0,1,0,2,0,1,1,2, 1,1,1,2,1,2,1,0,0,0, 2,1,0,1,0,2,0,1,2,2, 1,2,1,2,1,2,1,0,0,0, 0,1,1,2,1,0,1,0,2,0 }; int col,row ; for (int i=0;i<100;i++) { col=i%10+1; //列位置 = 索引号 %列数 +1 row=i/10+1; //行位置=索引/列数+1 switch(map[i]) { case 0: BitBlt(mdc1,(col-1)*30,(row-1)*30,30,30,mdc2,0,0,SRCCOPY) ; //将地图的第一部分区域粘贴到窗体 break; case 1: BitBlt(mdc1,(col-1)*30,(row-1)*30,30,30,mdc2,30,0,SRCCOPY) ; // 将地图的第二部分粘贴到指定位置 break ; case 2: BitBlt(mdc1,(col-1)*30,(row-1)*30,30,30,mdc2,60,0,SRCCOPY) ; //将地图的第三区域粘贴到指定位置 break ; }

} BitBlt(wndDC,0,0,300,300,mdc1,0,0,SRCCOPY) ; //将构建好的内存兼容位图选择到窗体上去 DeleteDC(mdc1) ; DeleteDC(mdc2) ; DeleteObject(mbitmap);

} LRESULT CALLBACK MapProc( HWND hwnd,UINT uMsg,WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_PAINT : PAINTSTRUCT ps ; BeginPaint(hwnd,&ps) ; PaintMap(wndDC,bitmap) ; EndPaint(hwnd,&ps) ; break;

case WM_CLOSE : PostQuitMessage(0) ; break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam) ;

}

return 0 ; } ATOM MyRegisterClassEx(HINSTANCE hist) { WNDCLASSEX cls ; cls.cbSize=sizeof(WNDCLASSEX) ; cls.cbClsExtra=0 ; cls.cbWndExtra =0; cls.hbrBackground=(HBRUSH)::GetStockObject(GRAY_BRUSH); cls.hIcon=NULL ; cls.hIconSm=NULL ; cls.hCursor=::LoadCursor(NULL,IDC_ARROW) ; cls.hInstance=hist ; cls.lpfnWndProc=(WNDPROC)MapProc; cls.lpszMenuName=NULL ; cls.lpszClassName=_T("MapWindow"); cls.style=CS_VREDRAW|CS_HREDRAW ; return ::RegisterClassEx(&cls) ;

}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {

MSG msg ; ist=hInstance ; MyRegisterClassEx(hInstance) ; InitInstance(hInstance) ; while (GetMessage(&msg,NULL,0,0)) //获得所有可以获得的消息 { TranslateMessage(&msg) ; //翻译消息 DispatchMessage(&msg) ; //分发消息 }

return msg.wParam; }



 


http://download.csdn.net/detail/yue7603835/4234039 此处下载 。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值