且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-08-13 07:56:25

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

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

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

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

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

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

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

       

 涉及到的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   此处下载 。。。。