又开始写代码了
来源:互联网 发布:linux切换进程cpu资源 编辑:程序博客网 时间:2024/03/29 10:02
先建了一个CGame类,把游戏控制的基本部分包装起来。
结构如下:
#pragma once
class CGame
{
public:
CGame(void);
~CGame(void);
// 开始游戏
int Start(void);
private:
// 游戏消息循环
int GameLoop(void);
// 游戏运行状态
bool bIsRunning;
};
然后把WinMain里面的消息循环放到了GameLoop里面
在WinMain里面原本消息循环的位置调用Game::Start()代替
// // 开始游戏
int CGame::Start(void)
{
// 读取游戏设置
// 初始化DirectDraw
//
bIsRunning = true;
return GameLoop();
}
// 游戏消息循环
int CGame::GameLoop(void)
{
MSG msg;
while (bIsRunning)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
//myDebug->OutDebug("Game Terminated.../n");
//break;
bIsRunning = false;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
消息循环部分还需要修改,在游戏窗口在非活动状态的时候等待消息,以阻塞线程,降低CPU资源占用。
在回调函数WndProc里面,加入检测窗口是否在活动状态的代码:
case WM_ACTIVATE: //应用程序是否活动
if(LOWORD(wParam)==WA_INACTIVE)
geGame.SetActive(false);
else if(HIWORD(wParam))
{
geGame.SetActive(false);
return 0;
}
else
{
SetCursor(NULL);
Game.SetActive(true);
}
上面的代码有两处SetActive(false),原理是从gpgame的圣剑2 copy的(现在好像个人/小团队开发的游戏都离不开“剑”字)还没搞清原理。不过需要注意的是,从非活动状态恢复的时候,需要重新获取输入、绘图设备等等。
至此CGame类大致的架构已经出来了。源码如下:
//Game.cpp
#include "StdAfx.h"
#include "./game.h"
CGame::CGame(void)
: bIsRunning(false)
, bActive(false)
{
}
CGame::~CGame(void)
{
}
// // 开始游戏
int CGame::Start(void)
{
// 读取游戏设置
// 初始化DirectDraw
// 开始游戏
bIsRunning = true;
return GameLoop();
}
// 游戏消息循环
int CGame::GameLoop(void)
{
MSG msg;
while (bIsRunning)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
bIsRunning = false; //退出游戏
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}else if(!bActive){
WaitMessage(); //等待消息
}else{
MainLoop(); //游戏主循环
}
}
return msg.wParam;
}
// 设置窗口是否活动
void CGame::SetActive(bool Active)
{
bActive = Active;
}
// 游戏主循环,负责更新状态,绘图翻页,响应等
void CGame::MainLoop(void)
{
return;
}
//Game.h
#pragma once
class CGame
{
public:
CGame(void);
~CGame(void);
// // 开始游戏
int Start(void);
private:
// 游戏消息循环
int GameLoop(void);
// 游戏运行状态
bool bIsRunning;
public:
// 窗口是否活动状态
bool bActive;
// 设置窗口是否活动
void SetActive(bool Active);
// 游戏主循环,负责更新状态,绘图,响应等
void MainLoop(void);
};
下一次就是DirectX的初始化了,深夜3:00了,玩玩横扫千军,然后睡觉。。。
- 又开始写代码了
- 又开始写blog了......
- 又开始写html了
- 又开始写博客了
- 开始写代码了
- 又开始写html了(二)
- 又忙着写了几天代码
- 开始怀念博客了,又想再开始写了,继续写... ...
- 又要开始写objective-c程序了
- 【入坑】又要开始写解题报告了
- 年近40的我又开始了写代码的工作,重新写了一个C++的数据库连接池的类,个人觉得挺方便的
- 又开始呕吐了
- 又开始郁闷了
- 又开始工作了
- 工作又开始了!
- 又开始上班了
- 又开始工作了
- 又开始上班了
- 【诗歌】蛙声一片
- (转载)从IRQ到IRQL(APIC版)
- Linux技巧小总结
- 多项式相加(链表的汇编语言实现)
- 在SharpDevelop里调试程序
- 又开始写代码了
- 2月8日,GINA&WINLOGON的一点东西
- 制作Docbook文档
- 弄了个新年气氛的 Themes ,喜欢的拿去:)
- 《Undocumented Windows 2000 Secrets》翻译 --- 第三章(2)
- 非常有用的个小技巧 JS的.
- 呵呵,最后一天班
- Perl中对查询得的数据排序。
- 今夕是何年?