• 一个简单的游戏开发框架(四.舞台Stage)


    首先是StageManager类:

    class StageManager : public Singleton<StageManager>
    {
        friend class Singleton<StageManager>;
    private:
        StageManager() : _curStage(0), _pStageCreator(nullptr) {}
        ~StageManager();
    
    public:
        bool InitStageManager();
        Stage* SwitchStage(uint32 stageID, bool bDestroyOld);
    
        void SetStageCreator(StageCreator* pCreator) { _pStageCreator = pCreator; }
    
        Stage* GetStageByID(uint32 stageID);
        Stage* GetCurStage() { return GetStageByID(_curStage); }
    
    private:
        std::map<uint32, Stage*>    _stages;
        uint32                      _curStage;
        StageCreator*               _pStageCreator;
    };

    这个类的功能是:

    1.管理Stage的生存期

    2.作为单件,提供访问Stage的入口

    3.接收并处理相关事件

    它主要的操作是SwitchStage,首先判断Stage是否存在,如果不存在,创建,加载并显示它,并且根据bDestroyOld参数,决定是否释放前一个Stage的资源。

    舞台类Stage如下:

    class Stage
    {
    public:
        Stage() : _bLoaded(false) {}
        virtual ~Stage();
    
    public:
        /// 向舞台加入对象
        virtual bool Add2Stage(Object* pObj);
        /// 加载舞台
        virtual void LoadStage(uint32 stageID);
        /// 心跳
        virtual void StageTick();
    
    public:
    bool IsLoaded() { return _bLoaded; }
    
    protected:
        bool                    _bLoaded;
        std::vector<Object*>    _objs;
    };

    这个类的功能是:

    1.加载舞台对象,管理对象生存期。

    在游戏初始化的时候,会读入一个类似下面的资源文件:

    <Stages>
        <Stage id = "1", file="stage1.xml" />
        <Stage id = "2", file="stage2.xml" />
    ……
    </Stages>

    stageN.xml的结构也很简单:

    <Stage>
        <Object type="npc" file="object1.xml">
        <Object type="npc" file="object2.xml">
        ……
    </Stage>

    StageManager和Stage根据这两个文件加载舞台和舞台上的对象。

    2.以适当的方式加载和显示地图。目前比较常见的地图加载方式有tilemap,整图加载,整图切片加载等,这些处理都被封装在Stage内部。随着项目需求的变化,会逐渐增加StageTileMap,StageWhole等派生类,服务器和客户端使用的Stage类也可能有所不同。但是StageManager并不知道应该创建哪一类Stage,为此需要增加一个抽象工厂:

    class StageCreator
    {
    public:
        virtual ~StageCreator() {}
    
        virtual Stage* CreateStage() = 0;
        virtual void ReleaseStage(Stage* pStage) = 0;
    };

    逻辑层需要实现该工厂,以指定创建的Stage类别。

    下面是一个简单的,基于cocos2d,整图加载,以指定角色为中心移动的Stage:

    class StageView : public Stage
    {
    public:
        StageView() : _pCenter(nullptr), _pScene(nullptr), _pLayer(nullptr) {}
    
    public:
        virtual bool InitStage();
        virtual bool Add2Stage(Object* pObj);
        virtual void LoadStage(uint32 stageID);
        virtual void StageTick();
    
    public:
        /// 以pObj为中心显示舞台
        void CenterStage(Object* pObj); 
        /// 指定舞台的中心对象
        void SetCenter(Object* pObj) { _pCenter = pObj; }
    
    public:
        cocos2d::CCScene* Scene() { return _pScene; }
    
    protected:
        Object*                      _pCenter;
        cocos2d::CCScene*            _pScene;
        StageLayer*                  _pLayer;
    };
  • 相关阅读:
    jquery.roundabout.js图片叠加3D旋转插件多功能图片翻转切换效果
    jquery.SuperSlide.js只需要调用一个插件就能实现网页大部分特效--推荐
    很不错的JS插件大全
    kxbdSuperMarquee.js滚动的神器-推荐
    琅琊榜
    三国群英2专题
    css中为了清除浮动经常用到的after样式
    非常简单的升级phpnow自带的php版本到5.3的方法
    手机访问网站如何自动跳转到手机版本自动转到手机网站
    php中几个字符串替换函数详解
  • 原文地址:https://www.cnblogs.com/bnudc/p/3423502.html
Copyright © 2020-2023  润新知