|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 冬冬 于 2012-5-25 17:30 编辑
平面地图贴图
下面是我从90坦克大战中扣取的素材所的例子:
图片可分为三中
红墙
白墙
和 黑色空白区
那么整个地区的结构,我们在程序里面该怎么表示呢,看看这个10x10的二维数组你就应该明白了,0表示空白,1表示红墙,2表示白墙
- int aryMap[10][10] = {
- {2,2,2,2,2,2,2,2,2,2},
- {2,0,0,0,0,0,0,0,0,2},
- {2,0,1,1,1,1,1,1,0,2},
- {2,0,1,1,1,1,1,1,0,2},
- {2,0,1,1,2,2,1,1,0,2},
- {2,0,1,1,2,2,1,1,0,2},
- {2,0,1,1,1,1,1,1,0,2},
- {2,0,1,1,1,1,1,1,0,2},
- {2,0,0,0,0,0,0,0,0,2},
- {2,2,2,2,2,2,2,2,2,2},
- };
复制代码
在声明一个10x10的数组用来加载资源
HBITMAP aryBmp[10][10];//保存加载的图片资源
- // 加载资源
- for(int i=0;i<10;i++)
- {
- for(int j=0;j<10;j++)
- {
- if (aryMap[j] == 1)
- {
- aryBmp[j] = (HBITMAP)LoadImage(0,L".\\RedWall.bmp",IMAGE_BITMAP,16,16,LR_LOADFROMFILE);
- }
- if (aryMap[j] == 2)
- {
- aryBmp[j] = (HBITMAP)LoadImage(0,L".\\WhiteWall.bmp",IMAGE_BITMAP,16,16,LR_LOADFROMFILE);
- }
- }
- }
复制代码
那么接下来我们就可一这样绘图了
- void MyPaint(HDC hdc)
- {
- HBITMAP bmpBuff;
- for (int i=0;i<10;i++)
- {
- for (int j=0;j<10;j++)
- {
- if(aryMap[j])
- {
- SelectObject(mdc,aryBmp[j]);
- BitBlt(hdc,j*16,i*16,16,16,mdc,0,0,SRCCOPY);
- }
- }
- }
- }
复制代码
贴下完整的代码把:- // 地图贴图.cpp : 定义应用程序的入口点。
- //
- #include "stdafx.h"
- #include "地图贴图.h"
- #define MAX_LOADSTRING 100
- // 全局变量:
- HINSTANCE hInst;// 当前实例
- TCHAR szTitle[MAX_LOADSTRING];// 标题栏文本
- TCHAR szWindowClass[MAX_LOADSTRING];// 主窗口类名
- int aryMap[10][10] = {
- {2,2,2,2,2,2,2,2,2,2},
- {2,0,0,0,0,0,0,0,0,2},
- {2,0,1,1,1,1,1,1,0,2},
- {2,0,1,1,1,1,1,1,0,2},
- {2,0,1,1,2,2,1,1,0,2},
- {2,0,1,1,2,2,1,1,0,2},
- {2,0,1,1,1,1,1,1,0,2},
- {2,0,1,1,1,1,1,1,0,2},
- {2,0,0,0,0,0,0,0,0,2},
- {2,2,2,2,2,2,2,2,2,2},
- };
- HBITMAP aryBmp[10][10];//保存加载的图片资源
- HDC hdc;
- HDC mdc;//内存DC
- // 此代码模块中包含的函数的前向声明:
- ATOMMyRegisterClass(HINSTANCE hInstance);
- BOOLInitInstance(HINSTANCE, int);
- LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);
- INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);
- void MyPaint(HDC hdc);//绘图函数
- int APIENTRY _tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- UNREFERENCED_PARAMETER(hPrevInstance);
- UNREFERENCED_PARAMETER(lpCmdLine);
- // TODO: 在此放置代码。
- MSG msg;
- HACCEL hAccelTable;
- // 初始化全局字符串
- LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
- LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);
- MyRegisterClass(hInstance);
- // 执行应用程序初始化:
- if (!InitInstance (hInstance, nCmdShow))
- {
- return FALSE;
- }
- hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));
- //游戏消息循环
- GetMessage(&msg, NULL, 0, 0);
- while (msg.message != WM_QUIT)
- {
- if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- else
- {
- MyPaint(hdc);
- }
- }
- return (int) msg.wParam;
- }
- //
- // 函数: MyRegisterClass()
- //
- // 目的: 注册窗口类。
- //
- // 注释:
- //
- // 仅当希望
- // 此代码与添加到 Windows 95 中的“RegisterClassEx”
- // 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
- // 这样应用程序就可以获得关联的
- // “格式正确的”小图标。
- //
- ATOM MyRegisterClass(HINSTANCE hInstance)
- {
- WNDCLASSEX wcex;
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style= CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc= WndProc;
- wcex.cbClsExtra= 0;
- wcex.cbWndExtra= 0;
- wcex.hInstance= hInstance;
- wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY));
- wcex.hCursor= LoadCursor(NULL, IDC_ARROW);
- wcex.hbrBackground= (HBRUSH)GetStockObject(BLACK_BRUSH);
- wcex.lpszMenuName= NULL;
- wcex.lpszClassName= szWindowClass;
- wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
- return RegisterClassEx(&wcex);
- }
- //
- // 函数: InitInstance(HINSTANCE, int)
- //
- // 目的: 保存实例句柄并创建主窗口
- //
- // 注释:
- //
- // 在此函数中,我们在全局变量中保存实例句柄并
- // 创建和显示主程序窗口。
- //
- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
- {
- HWND hWnd;
- hInst = hInstance; // 将实例句柄存储在全局变量中
- hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW&(~WS_SIZEBOX)&(~WS_MAXIMIZEBOX),
- CW_USEDEFAULT, 0, 165, 190, NULL, NULL, hInstance, NULL);
- if (!hWnd)
- {
- return FALSE;
- }
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- //创建DC
- hdc = GetDC(hWnd);
- mdc = CreateCompatibleDC(hdc);
- // 加载资源
- for(int i=0;i<10;i++)
- {
- for(int j=0;j<10;j++)
- {
- if (aryMap[j] == 1)
- {
- aryBmp[j] = (HBITMAP)LoadImage(0,L".\\RedWall.bmp",IMAGE_BITMAP,16,16,LR_LOADFROMFILE);
- }
- if (aryMap[j] == 2)
- {
- aryBmp[j] = (HBITMAP)LoadImage(0,L".\\WhiteWall.bmp",IMAGE_BITMAP,16,16,LR_LOADFROMFILE);
- }
- }
- }
- return TRUE;
- }
- //
- // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
- //
- // 目的: 处理主窗口的消息。
- //
- // WM_COMMAND- 处理应用程序菜单
- // WM_PAINT- 绘制主窗口
- // WM_DESTROY- 发送退出消息并返回
- //
- //
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- int wmId, wmEvent;
- PAINTSTRUCT ps;
- HDC hdc;
- switch (message)
- {
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // 分析菜单选择:
- switch (wmId)
- {
- case IDM_ABOUT:
- DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
- break;
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break;
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此添加任意绘图代码...
- EndPaint(hWnd, &ps);
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
- // “关于”框的消息处理程序。
- INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- UNREFERENCED_PARAMETER(lParam);
- switch (message)
- {
- case WM_INITDIALOG:
- return (INT_PTR)TRUE;
- case WM_COMMAND:
- if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
- {
- EndDialog(hDlg, LOWORD(wParam));
- return (INT_PTR)TRUE;
- }
- break;
- }
- return (INT_PTR)FALSE;
- }
- //绘图函数
- void MyPaint(HDC hdc)
- {
- HBITMAP bmpBuff;
- for (int i=0;i<10;i++)
- {
- for (int j=0;j<10;j++)
- {
- if(aryMap[j])
- {
- SelectObject(mdc,aryBmp[j]);
- BitBlt(hdc,j*16,i*16,16,16,mdc,0,0,SRCCOPY);
- }
- }
- }
- }
复制代码
|
|