本系列文章由Luffy_Luke(朱焕俊)编写,转载请注明出处。
这篇博客相当的基础,这只是我自己的笔记,自己在学习的时候的一些总结,现在就放在这里给大家看看。觉得不好的,有待改进的还请在评论中写出来,大家相互学习吧。
//总结下 制作小游戏的具体步骤
//首先 游戏的框架肯定是 Win32的框架了//现在来看 还是使用C++的类封装比较好,一个是省去了很多的全局变量,每次在写一个子模块的时候总要用到其他模块的变量,所以在前面总是有
//很多的 extern 变量,第二个就是避免了过度的相互包含,在C++类封装后,只需要一个Main.cpp中包含其他模块的文件就可以了。
//第三个 就是使用了C++后 结构会比较清晰,容易理解各个模块的联系。
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
//窗口注册
//创建窗口
ShowWindow(hWnd,iCmdShow);
UpdateWindow(hWnd);
//下面一般是 加载资源 和 初始化一些变量
SetTimer(hWnd,0,10,(TIMERPROC)TimerProc);//在这里使用一个 定时器函数,设置游戏的基本事件很 关键的函数
//有个 (TIMERPROC)TimerProc 的回调函数
srand((unsigned)time(NULL));//随机种子的使用
//消息循环
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage (&msg);DispatchMessage (&msg);
}}
return msg.wParam ;
//下面 就是重要的 消息回调函数了
//消息处理模块
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
OnCreate(hWnd,message,wParam,lParam);
return 0;
case WM_PAINT:
OnPaint(hWnd,message,wParam,lParam);return 0;
case WM_RBUTTONDOWN:
OnRButtonDown(hWnd,message,wParam,lParam);return 0;
case WM_RBUTTONUP:
OnRButtonUp(hWnd,message,wParam,lParam);return 0;
case WM_SETFOCUS:
return 0;
case WM_KILLFOCUS:
Games.tagPause=true;//一般使用暂停的标志
return 0;
case WM_CHAR:OnChar(hWnd,message,wParam,lParam);return 0;
case WM_KEYDOWN:
OnKeyDown(hWnd,message,wParam,lParam);return 0;
case WM_KEYUP:
OnKeyUp(hWnd,message,wParam,lParam);return 0;
case WM_DESTROY:
OnDestroy();return 0;
}}
return DefWindowProc(hWnd,message,wParam,lParam);
//当然还有 重要的 (TIMERPROC)TimerProc
//定时器操作
LRESULT CALLBACK TimerProc(HWND hWnd,UINT message,UINT iTimerID,DWORD dwTime)
{
//判断游戏的 进度
switch( m_nGameState )//游戏状态的枚举
{
case G_STARTING:
return StartingGame();//显示开始游戏的动态画面break;
case G_MENU:
return GameMenu();//显示游戏的开始主菜单break;
case G_GAME:
return GameMain();//进入游戏
break;
case G_OVER:
return GameOver();//游戏结束的画面break;
case G_PAUSE://游戏暂停的画面
return false;break;
default:
break;
}
//处理画面
InvalidateRect( hWnd, NULL, FALSE );//画面的处理都放在OnPaint 消息中了,其实就只有一句代码
//BitBlt(hdc, 0, 0, ?, ?,mdc,0,0, SRCCOPY );//就是最后吧 mdc中的位图给显示出来了
//在显示画面的时候 一般定义 3个 HDC 一个是 bufdc 一个是 mdc 最后一个就是 hdc
//在各个子模块里面 都是讲图元放在 bufdc中,然后将bufdc中的图片贴到 mdc中
//到最后的时候 就在 OnPaint 消息中把 mdc放在 hdc中,从而实现不闪屏的功能
}
//在GameMain() 函数中
{
//游戏引擎正式开始}
Games.Auto();//游戏类 里面对 你的游戏中的对象进行控制 显示 逻辑处理等操作
//显示游戏界面
Draw();
Draw()//这个函数处理的是一些 界面以上的显示 不需要存在mdc中的
{
//玩家信息栏位}
//显示时间栏
//显示 即时的消息