TA的每日心情 | 慵懒 2015-1-8 08:46 |
---|
签到天数: 2 天 连续签到: 1 天 [LV.1]测试小兵
|
模式:分解游戏循环。
问题:在Windows下使用WinAPI进行游戏设计时,由于消息循环的存在,往往要编写很复杂的状态机或者消息处理机制以实现多个用户界面的切换(比如,首先进入菜单,再进入主游戏界面),而不能像原始DOS游戏那样,用流程化的思想来设计主程序。
解决方案:针对游戏程序和游戏逻辑一般不需要倚赖消息机制的特点,提出分解游戏循环模式。游戏的每个模块每绘制一个游戏祯后,用while (PeekMessage)循环,处理所有绘制过程中积压的消息,然后进入下一次绘制。这样,游戏的模块可以简单的通过返回函数,由主程序形成原始而高效的状态机。
对比:
背景:
状态:
class State{
virtual void Draw()=0;
virtual int Update()=0;
};(注:虚函数只是为了方便说明。实际使用可以用任意的函数,包括非成员函数)
State *State1,*State2;已经初始化。
假设状态1结束后进入状态2。Update返回值-1表示结束程序,2表示跳转到状态2,0表示状态不变。
常用解决方案:
State *states[2]={State1,State2};
State *CurrentState = states[0]; //状态机模型。
while (TRUE){
if (PeekMessage...){ ProcessMessage...;}
CurrentState->Draw();
int ret = CurrentState->Update();
if (ret<0) {break;}
if (ret>0) {CurrentState = states[ret];}
}
现解决方案:
void PeekAllMessage(){
while (PeekMessage...){ ProcessMessage...;}
}
class State{
void Run(){
while (TRUE){
PeekAllMessage();
Draw();
int ret = Update();
if (ret<0) {exit(0);}
if (ret>0) {return;}
}
}
};
//in WinMain:
State1.Run();
State2.Run();
附注: 以上例程仅为做对比用。本模式可以用于更加过程化的结构,而无须使用C++特性。 |
|