[C++游戏编程]GDI类小游戏开发__第一弹_游戏框架

本文介绍了使用Win32 API及C++进行简单游戏开发的基本流程。从窗口创建到消息循环,再到定时器处理和游戏状态管理等方面进行了概述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列文章由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中的
{
//玩家信息栏位
//显示时间栏
//显示 即时的消息  
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值