51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2828|回复: 0
打印 上一主题 下一主题

模式:分解游戏循环

[复制链接]
  • TA的每日心情
    慵懒
    2015-1-8 08:46
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2007-11-30 15:47: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好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-15 00:57 , Processed in 0.079094 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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