游戏开发论坛

 找回密码
 立即注册
搜索
查看: 19896|回复: 21

模式:分解游戏循环

[复制链接]

4

主题

25

帖子

41

积分

注册会员

Rank: 2

积分
41
发表于 2007-9-19 10:06:00 | 显示全部楼层 |阅读模式
模式:分解游戏循环。
问题:在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++特性。


由于不常上论坛,欢迎大家与我QQ交流:402740419

18

主题

82

帖子

86

积分

注册会员

Rank: 2

积分
86
发表于 2007-9-19 11:06:00 | 显示全部楼层

Re:模式:分解游戏循环

什么意思?看不懂

15

主题

202

帖子

207

积分

中级会员

Rank: 3Rank: 3

积分
207
QQ
发表于 2007-9-21 14:37:00 | 显示全部楼层

Re:模式:分解游戏循环

设计模式?没看出比其他模式好在哪.

45

主题

1163

帖子

1165

积分

金牌会员

Rank: 6Rank: 6

积分
1165
发表于 2007-9-22 18:18:00 | 显示全部楼层

Re:模式:分解游戏循环

不解,不解。

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2007-10-9 13:00:00 | 显示全部楼层

Re:模式:分解游戏循环

如果想从状态2跳回状态1咋办?比如选人界面进入游戏,又从游戏返回选择界面,这样?
State1.Run();
State2.Run();
State1.Run();
如果需要不停的来回跳呢?
State1.Run();
State2.Run();
State1.Run();
State2.Run();
State1.Run();
State2.Run();......

4

主题

25

帖子

41

积分

注册会员

Rank: 2

积分
41
 楼主| 发表于 2007-10-10 10:31:00 | 显示全部楼层

Re:模式:分解游戏循环

很简单啊,你可以写一个返回值,然后像以前的任何过程化的程序一样写:

State1.Run();
while (3==State2.Run())
  State1.Run();

只是提供一种方法。并不是所有场合都适合这方法

5

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2007-10-17 20:05:00 | 显示全部楼层

Re:模式:分解游戏循环

不是打击你。这种方法不具备一点实用性,实时性、框架灵活性都得不到保证

2

主题

108

帖子

116

积分

注册会员

Rank: 2

积分
116
发表于 2007-10-18 13:25:00 | 显示全部楼层

Re:模式:分解游戏循环

支持8楼。。

0

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2007-10-19 12:00:00 | 显示全部楼层

Re:模式:分解游戏循环

8楼有什么好意见.随便说一下,开导我们这些新人一下.

5

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2007-10-29 13:14:00 | 显示全部楼层

Re:模式:分解游戏循环

还是去看看DX提供的标准示例吧
while(msg.message != WM_QUIT)
{
if(PeekMessage())
{
//消息转换
//消息发送
}
operation();//自己的 用于游戏中各个参数的改变,包括了所谓的state改变,输入操作引起的一些列变化
render(); //这个不用多说了,就是根据参数进行渲染,说白了就是将画面显示给玩家看
}

不过这个还要考虑一个刷新率的问题,其实也有固定的方法的,打家可以研究下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 14:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表