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

 

目录
相关文章
|
机器学习/深度学习 存储 算法
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
反向传播算法虽是深度学习基石,但面临内存消耗大和并行扩展受限的问题。近期,牛津大学等机构提出NoProp方法,通过扩散模型概念,将训练重塑为分层去噪任务,无需全局前向或反向传播。NoProp包含三种变体(DT、CT、FM),具备低内存占用与高效训练优势,在CIFAR-10等数据集上达到与传统方法相当的性能。其层间解耦特性支持分布式并行训练,为无梯度深度学习提供了新方向。
803 1
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
|
8月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
371 0
|
存储 程序员 编译器
玩转C++内存管理:从新手到高手的必备指南
C++中的内存管理是编写高效、可靠程序的关键所在。C++不仅继承了C语言的内存管理方式,还增加了面向对象的内存分配机制,使得内存管理既有灵活性,也更加复杂。学习内存管理不仅有助于提升程序效率,还有助于理解计算机的工作原理和资源分配策略。
|
11月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
360 26
|
算法 JavaScript 前端开发
新生代和老生代内存划分的原理是什么?
【10月更文挑战第29天】新生代和老生代内存划分是JavaScript引擎为了更高效地管理内存、提高垃圾回收效率而采用的一种重要策略,它充分考虑了不同类型对象的生命周期和内存使用特点,通过不同的垃圾回收算法和晋升机制,实现了对内存的有效管理和优化。
|
C语言 C++
c与c++的内存管理
再比如还有这样的分组: 这种分组是最正确的给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)当然也会看到别的定义如:两者都正确,记那个都选,我选择的是第一个。再比如还有这样的分组: 这种分组是最正确的答案分别是 C C C A A A A A D A B。
208 1
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
472 1
|
存储 缓存 编译器
【硬核】C++11并发:内存模型和原子类型
本文从C++11并发编程中的关键概念——内存模型与原子类型入手,结合详尽的代码示例,抽丝剥茧地介绍了如何实现无锁化并发的性能优化。
767 68
|
存储 Linux C语言
C++/C的内存管理
本文主要讲解C++/C中的程序区域划分与内存管理方式。首先介绍程序区域,包括栈(存储局部变量等,向下增长)、堆(动态内存分配,向上分配)、数据段(存储静态和全局变量)及代码段(存放可执行代码)。接着探讨C++内存管理,new/delete操作符相比C语言的malloc/free更强大,支持对象构造与析构。还深入解析了new/delete的实现原理、定位new表达式以及二者与malloc/free的区别。最后附上一句鸡汤激励大家行动缓解焦虑。

热门文章

最新文章