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

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

              此文章由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   此处下载 。。。。

 

目录
相关文章
|
15天前
|
小程序 编译器 Linux
C++ 异常原理:以一个小程序为例
作者在调查某个 bug 时涉及到 C++ 异常,借此机会以本文把 C++ 异常机制梳理清楚供大家参考。
|
1天前
|
存储 Linux 程序员
【操作系统原理】—— Linux内存管理
【操作系统原理】—— Linux内存管理
3 0
|
6天前
|
安全 Java Android开发
构建高效Android应用:采用Kotlin进行内存优化的策略
【5月更文挑战第8天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,合理管理内存资源是确保应用流畅运行的关键因素之一。近年来,Kotlin作为官方推荐的开发语言,以其简洁、安全和互操作性的特点受到开发者青睐。本文将深入探讨利用Kotlin语言特性,通过具体策略对Android应用的内存使用进行优化,旨在帮助开发者提高应用性能,减少内存消耗,避免常见的内存泄漏问题。
8 0
|
7天前
|
Arthas 监控 Java
JVM工作原理与实战(三十一):诊断内存泄漏的原因
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了诊断内存溢出的原因、MAT内存泄漏检测的原理等内容。
12 0
|
7天前
|
存储 Arthas 监控
JVM工作原理与实战(三十):堆内存状况的对比分析
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了堆内存状况的对比分析、产生内存溢出的原因等内容。
13 0
|
7天前
|
Arthas Prometheus 监控
JVM工作原理与实战(二十九):监控内存泄漏的工具
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了解决内存溢出的步骤、Top命令、VisualVM、Arthas、Prometheus + Grafana等内容。
15 0
|
7天前
|
监控 Java 测试技术
JVM工作原理与实战(二十八):内存溢出和内存泄漏
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了内存溢出与内存泄漏、内存泄漏的常见场景、解决内存溢出的步骤等内容。
10 0
JVM工作原理与实战(二十八):内存溢出和内存泄漏
|
7天前
|
监控 安全 Java
JVM工作原理与实战(二十一):内存管理
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了不同语言的内存管理(C/C++、Java)、垃圾回收的对比(自动垃圾回收与手动垃圾回收)等内容。
12 0
|
7天前
|
Arthas 存储 监控
JVM工作原理与实战(二十):直接内存
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了直接内存、在直接内存上创建数据等内容。
|
7天前
|
存储 监控 Java
JVM工作原理与实战(十七):运行时数据区-栈内存溢出
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了栈内存溢出、设置虚拟机栈的大小等内容。
12 0