Windows API初步实现游戏界面
2014-05-02 10:24
162 查看
首先将位图资源载入工程
具体实现方法:Insert > Resource > Import 载入位图资源,保存成xxx.rc资源文件,最后编译资源文件,发现左下角会多出一个Resource View选项卡,接着为每个资源取一个容易记忆的ID,这样就将位图资源载入工程了。
下面用LoadBitmap将资源中的文件载入程序,示例代码如下:
双缓冲技术
要在屏幕上显示位图需要用到双缓冲技术,即在一个设备描述表上创建一个与此兼容的设备描述表,然后在这个兼容的设备描述表上创建兼容的位图,接着用SelectObject将位图作用于兼容的设备描述表,最后关键的步骤用Bitblt将兼容DC贴到DC上。
具体实现代码如下:
API实现按钮的绘制
在WIN32 SDK中,按钮也是属于一种窗口,只不过是附属于某个父窗口的子窗口,因此也可以使用CreateWindow创建一个按钮
用以上知识就可以实现一个游戏界面
实现代码:
具体实现方法:Insert > Resource > Import 载入位图资源,保存成xxx.rc资源文件,最后编译资源文件,发现左下角会多出一个Resource View选项卡,接着为每个资源取一个容易记忆的ID,这样就将位图资源载入工程了。
下面用LoadBitmap将资源中的文件载入程序,示例代码如下:
HBITMAP bmp_ground=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_GROUND);
双缓冲技术
要在屏幕上显示位图需要用到双缓冲技术,即在一个设备描述表上创建一个与此兼容的设备描述表,然后在这个兼容的设备描述表上创建兼容的位图,接着用SelectObject将位图作用于兼容的设备描述表,最后关键的步骤用Bitblt将兼容DC贴到DC上。
具体实现代码如下:
hdc=GetDC(hwnd);//设备描述表 MemDC=CreateCompatibleDC(hdc);//兼容的设备描述表 CreateCompatibleBitmap(MemDC,0,0);//兼容的位图 SelectObject(MemDC,bmp_cloud);//将位图作用于兼容的设备描述表 //BitBlt(hdc,0,0,537,232,MemDC,0,0,SRCCOPY);//将兼容的设备描述表贴到设备描述表上 TransparentBlt(hdc,20,80,89,50,MemDC,0,0,89,50,RGB(0,0,0));//该行代码实现功能同上,但实现了背景透明的效果 DeleteDC(MemDC);//释放兼容的设备描述表 ReleaseDC(hwnd,hdc);//释放设备描述表
API实现按钮的绘制
在WIN32 SDK中,按钮也是属于一种窗口,只不过是附属于某个父窗口的子窗口,因此也可以使用CreateWindow创建一个按钮
HWND hwnd_check; hwnd_check=CreateWindow("BUTTON","开始游戏",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,350,400,80,28,hwnd,NULL,NULL,NULL);
用以上知识就可以实现一个游戏界面
实现代码:
#include <windows.h> #include "resource.h" LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ){ WNDCLASS wnd; wnd.cbClsExtra=0; wnd.cbWndExtra=0; wnd.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wnd.hCursor=LoadCursor(hInstance,(LPCTSTR)IDC_CURSOR2); wnd.hIcon=LoadIcon(hInstance,IDI_APPLICATION); wnd.hInstance=hInstance; wnd.lpfnWndProc=WndProc; wnd.lpszClassName="window"; wnd.lpszMenuName=NULL; wnd.style=CS_HREDRAW|CS_VREDRAW; RegisterClass(&wnd); HWND hwnd; HWND hwnd_check; hwnd=CreateWindow("window","超级玛丽",WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME,300,40,800,600,NULL,NULL,hInstance,NULL); hwnd_check=CreateWindow("BUTTON","开始游戏",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,350,400,80,28,hwnd,NULL,NULL,NULL); ShowWindow(hwnd,nShowCmd); MSG msg; while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ HDC hdc; HDC MemDC; PAINTSTRUCT ps; RECT r={0,0,800,600}; RECT rc_ground={0,530,800,600}; RECT rc_grass={0,500,800,530}; HBITMAP bmp_ground=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_GROUND); HBITMAP bmp_sky=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_SKY); HBITMAP bmp_stack=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_STACK); HBITMAP bmp_rock=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_ROCK); HBITMAP bmp_title=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_TITLE); HBITMAP bmp_grass=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_GRASS); HBITMAP bmp_cloud=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_CLOUD); switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); break; case WM_PAINT: hdc=GetDC(hwnd);//设备描述表 MemDC=CreateCompatibleDC(hdc); CreateCompatibleBitmap(MemDC,0,0); HBRUSH hbr_sky=CreatePatternBrush(bmp_sky); HBRUSH hbr_ground=CreatePatternBrush(bmp_ground); //天空 FillRect(hdc,&r,hbr_sky); //地面 FillRect(hdc,&rc_ground,hbr_ground); //草 SelectObject(MemDC,bmp_grass); //BitBlt(hdc,0,0,537,232,MemDC,0,0,SRCCOPY); for(int num_grass=0;num_grass<10;num_grass++){ TransparentBlt(hdc,150+28*num_grass,506,28,24,MemDC,0,0,28,24,RGB(255,255,255)); } //云朵 SelectObject(MemDC,bmp_cloud); //BitBlt(hdc,0,0,537,232,MemDC,0,0,SRCCOPY); TransparentBlt(hdc,20,80,89,50,MemDC,0,0,89,50,RGB(0,0,0)); //标题 SelectObject(MemDC,bmp_title); //BitBlt(hdc,0,0,537,232,MemDC,0,0,SRCCOPY); TransparentBlt(hdc,140,30,537,232,MemDC,0,0,537,232,RGB(0,255,0)); //烟囱 SelectObject(MemDC,bmp_stack); //BitBlt(hdc,200,465,264,530,MemDC,0,0,SRCCOPY); TransparentBlt(hdc,500,465,64,65,MemDC,0,0,64,65,RGB(255,255,255)); //墙 SelectObject(MemDC,bmp_rock); for(int num_rock=0;num_rock<10;num_rock++){ //BitBlt(hdc,0+32*num_rock,300,32+32*num_rock,332,MemDC,0,0,SRCCOPY); TransparentBlt(hdc,0+32*num_rock,330,32,32,MemDC,0,0,32,32,RGB(255,255,255)); } DeleteDC(MemDC); ReleaseDC(hwnd,hdc); break; } return DefWindowProc(hwnd,uMsg,wParam,lParam); }
相关文章推荐
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之开发游戏界面(二)
- 简单实现21点游戏(文字界面)
- xGuiLuna界面方案初步实现
- Html+css+jQuery实现扫雷游戏(一)初步设计
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之开发游戏界面(二)
- android 3D 游戏实现之综合实例(初步)
- 绘制3*3游戏界面,并实现在其上添加字
- cell的循环利用——实现游戏英雄展示界面
- 如何实现从登陆界面跳转到游戏大厅界面
- cocos2d-x 实现按Home和待机键后,再进入游戏显示暂停界面
- libgdx游戏引擎教程(五)多游戏界面的实现(一)附源码
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)
- 利用SDL+CEGUI框架实现VTP的游戏界面风格
- Android-使用XML布局文件实现游戏的开始界面
- React-native数独游戏(二)界面实现
- C#winform 实现 QQ2009游戏界面
- libgdx游戏引擎教程(六)多游戏界面的实现(二)附源码
- 常见游戏Loading界面的实现
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之开发游戏界面(二)
- 图层控制界面实现记录-类框架搭建和初步实验