D3D之2D游戏编程(二)——游戏主窗口
来源:互联网 发布:matlab 矩阵元素运算 编辑:程序博客网 时间:2024/05/29 15:21
在开始写游戏相关的代码之前,我们需要实现Win32程序的大体框架,其中最重要的是主窗口和消息循环。我不打算使用诸如WTL,MFC之类的GUI框架,在游戏编程中,这些框架除了增加复杂性之外并没有太大好处。最明智的做法是自己写一个简单但适合于游戏开发的视窗框架。我接下来将会实现它,这个框架用到代码非常的少,甚至没有类的存在,但它的确满足要求了。最重要的一点是,它非常容易理解。
创建工程
- main/App.cpp- lib/Commons.hWindowFrame.hWindowFrame.cpp
- 一个顶层窗口
- 一个消息循环
- FPS计算
创建窗口
BOOL InitWindow(LPCTSTR title, int clientWidth, int clientHeight, WINDOWPROC procWnd)
{
#define WND_CLASSNAME _T("colin.windows.class")
_WndProc = procWnd;
// 注册窗口类
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)_WindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = ThisModuleHandle();
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = WND_CLASSNAME;
wcex.hIconSm = NULL;
if (!RegisterClassEx(&wcex))
{
_ASSERT(!"RegisterClassEx failed!");
return FALSE;
}
// 创建窗口
int width = clientWidth + 2 * GetSystemMetrics(SM_CXDLGFRAME);
int height = clientHeight + 2 * GetSystemMetrics(SM_CYDLGFRAME) + GetSystemMetrics(SM_CYCAPTION);
_Hwnd = CreateWindow(
WND_CLASSNAME,
title,
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT,
width, height,
NULL, NULL, ThisModuleHandle(), NULL);
if (!_Hwnd)
{
_ASSERT(!"CreateWindow failed!");
return FALSE;
}
// 显示窗口
ShowWindow(_Hwnd, SW_SHOWNORMAL);
UpdateWindow(_Hwnd);
return TRUE;
}
// 如果返回FALSE,将调用系统默认的窗口过程,ret被忽略。
// 如果返回TRUE,不调用系统默认的窗口过程,ret将返回给系统
typedef BOOL (*WINDOWPROC)(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT& ret);
WINDOWPROC _WndProc; // 窗口回调
int _FPS; // 每秒渲染帧数
HWND GetHwnd();
消息循环
{
MSG msg = {0};
DWORD currTick;
DWORD lastTick = GetTick();
DWORD lastSecTick = lastTick;
int renderCount = 0;
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
currTick = GetTick();
// FPS
if (currTick - lastSecTick >= 1000)
{
_FPS = renderCount;
renderCount = 0;
lastSecTick = currTick;
}
// 渲染
if ((currTick - lastTick >= renderTime) && procRender)
{
++renderCount;
lastTick = currTick;
procRender(currTick);
}
else
{
Sleep(1);
}
}
}
}
// tick指定当前时钟计数
typedef void (*RENDERPROC)(DWORD tick);
程序主流程
{
return FALSE;
}
void DoRender(DWORD tick)
{
}
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
if (InitWindow(_T("测试窗口"), 800, 600, &WindowProc))
{
MessageLoop(20, &DoRender);
}
return 0;
}
- D3D之2D游戏编程(二)——游戏主窗口
- D3D之2D游戏编程(二)——使用DxSDK
- D3D之2D游戏编程(一)——D3D图形管道
- D3D游戏编程系列(二):自己动手编写即时战略游戏之地图编辑器的制作
- 3D游戏基础 Direct3D(二) D3D初始化
- bada 2D游戏编程之二——图像绘制
- 3D游戏编程入门(十一)D3D基础之FVF格式,图元
- 3D游戏编程入门(十一)D3D基础之FVF格式,图元
- bada 2D游戏编程之三——游戏的基本结构
- bada 2D游戏编程之四——设计游戏循环
- bada 2D游戏编程之五——一个基于定时器的游戏循环
- bada 2D游戏编程之六——一个基于线程的游戏循环
- 3D游戏编程(二)
- D3D游戏编程系列(三):自己动手编写即时战略游戏之寻路
- D3D游戏编程系列(四):自己动手编写即时战略游戏之网络同步
- D3D游戏编程系列(五):自己动手编写第一人称射击游戏之室外场景的构建
- D3D游戏编程系列(六):自己动手编写第一人称射击游戏之第一人称视角的构建
- D3D游戏编程系列(七):自己动手编写rpg游戏之第三人称视角的构建
- 好难搞啊 找个答案搞半天
- 第一个bfs题目 hdu1175连连看
- joj 2693
- Android摇晃检测ShakeDetector
- 项目实施进度的挣值分析
- D3D之2D游戏编程(二)——游戏主窗口
- Android应用实例之----基于BroadCastReceiver的SD卡装载卸载实例!
- Poj 2456 Aggressive cows
- Oracle之SQL语言基础准备
- redhat linux上安装 gcc编译器
- SDK,画图,还有什么?
- 简洁、美观、强大、实用的Foobar2000界面
- 经典语录(转)
- RedHat9下安装gcc时可能遇到的问题及解决