鱼C论坛

 找回密码
 立即注册
查看: 3514|回复: 7

[技术交流] 游戏编程学习——平面地图贴图

[复制链接]
发表于 2012-5-25 11:57:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬冬 于 2012-5-25 17:30 编辑

平面地图贴图
下面是我从90坦克大战中扣取的素材所的例子:
QQ截图20120525113946.png
图片可分为三中
红墙   地图素材_07.gif   白墙 地图素材_19.gif    和 黑色空白区
那么整个地区的结构,我们在程序里面该怎么表示呢,看看这个10x10的二维数组你就应该明白了,0表示空白,1表示红墙,2表示白墙
  1. int aryMap[10][10] = {
  2. {2,2,2,2,2,2,2,2,2,2},
  3. {2,0,0,0,0,0,0,0,0,2},
  4. {2,0,1,1,1,1,1,1,0,2},
  5. {2,0,1,1,1,1,1,1,0,2},
  6. {2,0,1,1,2,2,1,1,0,2},
  7. {2,0,1,1,2,2,1,1,0,2},
  8. {2,0,1,1,1,1,1,1,0,2},
  9. {2,0,1,1,1,1,1,1,0,2},
  10. {2,0,0,0,0,0,0,0,0,2},
  11. {2,2,2,2,2,2,2,2,2,2},
  12. };
复制代码


在声明一个10x10的数组用来加载资源
HBITMAP aryBmp[10][10];//保存加载的图片资源

  1. // 加载资源
  2. for(int i=0;i<10;i++)
  3. {
  4. for(int j=0;j<10;j++)
  5. {
  6. if (aryMap[j] == 1)
  7. {
  8. aryBmp[j] = (HBITMAP)LoadImage(0,L".\\RedWall.bmp",IMAGE_BITMAP,16,16,LR_LOADFROMFILE);
  9. }

  10. if (aryMap[j] == 2)
  11. {
  12. aryBmp[j] = (HBITMAP)LoadImage(0,L".\\WhiteWall.bmp",IMAGE_BITMAP,16,16,LR_LOADFROMFILE);
  13. }
  14. }
  15. }
复制代码

那么接下来我们就可一这样绘图了
  1. void MyPaint(HDC hdc)
  2. {
  3. HBITMAP bmpBuff;

  4. for (int i=0;i<10;i++)
  5. {
  6. for (int j=0;j<10;j++)
  7. {
  8. if(aryMap[j])
  9. {
  10. SelectObject(mdc,aryBmp[j]);
  11. BitBlt(hdc,j*16,i*16,16,16,mdc,0,0,SRCCOPY);
  12. }
  13. }
  14. }
  15. }
复制代码

贴下完整的代码把:
  1. // 地图贴图.cpp : 定义应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include "地图贴图.h"

  5. #define MAX_LOADSTRING 100

  6. // 全局变量:
  7. HINSTANCE hInst;// 当前实例
  8. TCHAR szTitle[MAX_LOADSTRING];// 标题栏文本
  9. TCHAR szWindowClass[MAX_LOADSTRING];// 主窗口类名
  10. int aryMap[10][10] = {
  11. {2,2,2,2,2,2,2,2,2,2},
  12. {2,0,0,0,0,0,0,0,0,2},
  13. {2,0,1,1,1,1,1,1,0,2},
  14. {2,0,1,1,1,1,1,1,0,2},
  15. {2,0,1,1,2,2,1,1,0,2},
  16. {2,0,1,1,2,2,1,1,0,2},
  17. {2,0,1,1,1,1,1,1,0,2},
  18. {2,0,1,1,1,1,1,1,0,2},
  19. {2,0,0,0,0,0,0,0,0,2},
  20. {2,2,2,2,2,2,2,2,2,2},
  21. };
  22. HBITMAP aryBmp[10][10];//保存加载的图片资源
  23. HDC hdc;
  24. HDC mdc;//内存DC


  25. // 此代码模块中包含的函数的前向声明:
  26. ATOMMyRegisterClass(HINSTANCE hInstance);
  27. BOOLInitInstance(HINSTANCE, int);
  28. LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);
  29. INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);
  30. void MyPaint(HDC hdc);//绘图函数


  31. int APIENTRY _tWinMain(HINSTANCE hInstance,
  32.   HINSTANCE hPrevInstance,
  33.   LPTSTR    lpCmdLine,
  34.   int       nCmdShow)
  35. {
  36. UNREFERENCED_PARAMETER(hPrevInstance);
  37. UNREFERENCED_PARAMETER(lpCmdLine);

  38. // TODO: 在此放置代码。
  39. MSG msg;
  40. HACCEL hAccelTable;

  41. // 初始化全局字符串
  42. LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  43. LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);
  44. MyRegisterClass(hInstance);

  45. // 执行应用程序初始化:
  46. if (!InitInstance (hInstance, nCmdShow))
  47. {
  48. return FALSE;
  49. }

  50. hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));

  51. //游戏消息循环
  52. GetMessage(&msg, NULL, 0, 0);
  53. while (msg.message != WM_QUIT)
  54. {
  55. if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  56. {
  57. TranslateMessage(&msg);
  58. DispatchMessage(&msg);
  59. }
  60. else
  61. {
  62. MyPaint(hdc);
  63. }
  64. }


  65. return (int) msg.wParam;
  66. }



  67. //
  68. //  函数: MyRegisterClass()
  69. //
  70. //  目的: 注册窗口类。
  71. //
  72. //  注释:
  73. //
  74. //    仅当希望
  75. //    此代码与添加到 Windows 95 中的“RegisterClassEx”
  76. //    函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
  77. //    这样应用程序就可以获得关联的
  78. //    “格式正确的”小图标。
  79. //
  80. ATOM MyRegisterClass(HINSTANCE hInstance)
  81. {
  82. WNDCLASSEX wcex;

  83. wcex.cbSize = sizeof(WNDCLASSEX);

  84. wcex.style= CS_HREDRAW | CS_VREDRAW;
  85. wcex.lpfnWndProc= WndProc;
  86. wcex.cbClsExtra= 0;
  87. wcex.cbWndExtra= 0;
  88. wcex.hInstance= hInstance;
  89. wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY));
  90. wcex.hCursor= LoadCursor(NULL, IDC_ARROW);
  91. wcex.hbrBackground= (HBRUSH)GetStockObject(BLACK_BRUSH);
  92. wcex.lpszMenuName= NULL;
  93. wcex.lpszClassName= szWindowClass;
  94. wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

  95. return RegisterClassEx(&wcex);
  96. }

  97. //
  98. //   函数: InitInstance(HINSTANCE, int)
  99. //
  100. //   目的: 保存实例句柄并创建主窗口
  101. //
  102. //   注释:
  103. //
  104. //        在此函数中,我们在全局变量中保存实例句柄并
  105. //        创建和显示主程序窗口。
  106. //
  107. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  108. {
  109. HWND hWnd;

  110. hInst = hInstance; // 将实例句柄存储在全局变量中

  111. hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW&(~WS_SIZEBOX)&(~WS_MAXIMIZEBOX),
  112. CW_USEDEFAULT, 0, 165, 190, NULL, NULL, hInstance, NULL);

  113. if (!hWnd)
  114. {
  115. return FALSE;
  116. }

  117. ShowWindow(hWnd, nCmdShow);
  118. UpdateWindow(hWnd);
  119. //创建DC
  120. hdc = GetDC(hWnd);
  121. mdc = CreateCompatibleDC(hdc);

  122. // 加载资源
  123. for(int i=0;i<10;i++)
  124. {
  125. for(int j=0;j<10;j++)
  126. {
  127. if (aryMap[j] == 1)
  128. {
  129. aryBmp[j] = (HBITMAP)LoadImage(0,L".\\RedWall.bmp",IMAGE_BITMAP,16,16,LR_LOADFROMFILE);
  130. }

  131. if (aryMap[j] == 2)
  132. {
  133. aryBmp[j] = (HBITMAP)LoadImage(0,L".\\WhiteWall.bmp",IMAGE_BITMAP,16,16,LR_LOADFROMFILE);
  134. }
  135. }
  136. }
  137. return TRUE;
  138. }

  139. //
  140. //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
  141. //
  142. //  目的: 处理主窗口的消息。
  143. //
  144. //  WM_COMMAND- 处理应用程序菜单
  145. //  WM_PAINT- 绘制主窗口
  146. //  WM_DESTROY- 发送退出消息并返回
  147. //
  148. //
  149. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  150. {
  151. int wmId, wmEvent;
  152. PAINTSTRUCT ps;
  153. HDC hdc;

  154. switch (message)
  155. {
  156. case WM_COMMAND:
  157. wmId    = LOWORD(wParam);
  158. wmEvent = HIWORD(wParam);
  159. // 分析菜单选择:
  160. switch (wmId)
  161. {
  162. case IDM_ABOUT:
  163. DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  164. break;
  165. case IDM_EXIT:
  166. DestroyWindow(hWnd);
  167. break;
  168. default:
  169. return DefWindowProc(hWnd, message, wParam, lParam);
  170. }
  171. break;
  172. case WM_PAINT:
  173. hdc = BeginPaint(hWnd, &ps);
  174. // TODO: 在此添加任意绘图代码...
  175. EndPaint(hWnd, &ps);
  176. break;
  177. case WM_DESTROY:
  178. PostQuitMessage(0);
  179. break;
  180. default:
  181. return DefWindowProc(hWnd, message, wParam, lParam);
  182. }
  183. return 0;
  184. }

  185. // “关于”框的消息处理程序。
  186. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  187. {
  188. UNREFERENCED_PARAMETER(lParam);
  189. switch (message)
  190. {
  191. case WM_INITDIALOG:
  192. return (INT_PTR)TRUE;

  193. case WM_COMMAND:
  194. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  195. {
  196. EndDialog(hDlg, LOWORD(wParam));
  197. return (INT_PTR)TRUE;
  198. }
  199. break;
  200. }
  201. return (INT_PTR)FALSE;
  202. }


  203. //绘图函数
  204. void MyPaint(HDC hdc)
  205. {
  206. HBITMAP bmpBuff;

  207. for (int i=0;i<10;i++)
  208. {
  209. for (int j=0;j<10;j++)
  210. {
  211. if(aryMap[j])
  212. {
  213. SelectObject(mdc,aryBmp[j]);
  214. BitBlt(hdc,j*16,i*16,16,16,mdc,0,0,SRCCOPY);
  215. }
  216. }
  217. }
  218. }
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
头像被屏蔽
发表于 2012-5-25 15:57:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2012-5-25 16:54:39 | 显示全部楼层
弄个简单点的啊亲。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-5-25 17:23:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-5-25 17:24:16 | 显示全部楼层
本帖最后由 冬冬 于 2012-5-25 17:27 编辑
优质矿泉水 发表于 2012-5-25 16:54
弄个简单点的啊亲。。

就几个绘图函数啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-25 20:20:18 | 显示全部楼层
冬冬 发表于 2012-5-25 17:24
就几个绘图函数啊

請問你遊戲編程都看那些書^^?
我也想編遊戲><  (windows 單機就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-26 10:16:35 | 显示全部楼层
:lol  不错  学习了   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-27 13:14:50 | 显示全部楼层
学习,学习!...这几天还真发愁从什么地方入手学习呢@!.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 09:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表