首先是StageManager类:

class StageManager : public Singleton<StageManager>
{
friend class Singleton<StageManager>;
private:
StageManager() : _curStage(), _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() = ;
virtual void ReleaseStage(Stage* pStage) = ;
};

逻辑层需要实现该工厂,以指定创建的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;
};

一个简单的游戏开发框架(四.舞台Stage)的更多相关文章

  1. 一个简单的游戏开发框架(七.动作Motion)

    发现还没谈到最基本也是最重要的问题,怎么画图,画动画? 在原版cocos2d-x里画动画比较麻烦,见cocos2d-x学习笔记04:简单动画 cocostudio扩展出CCArmature类,就比较简 ...

  2. 一个简单的游戏开发框架(五.对象Object)

    前面提到我们把行为Action从对象Object中分离了出来,用各种不同的行为组合出对象的功能.大家都知道,面向对象的一个类,就是数据和操作的集合.操作(行为)被分离出来了,数据怎么办呢?操作依赖的数 ...

  3. 一个简单的游戏开发框架(六.行为Action)

    Action是cocos2d-x中比较重要的概念,有一个庞大的类族.参见老G写的cocos2d-x学习笔记09:动作2:持续动作 除了各种包装器,剩下的主要是一些持续动作: CCMoveTo:移动到. ...

  4. Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token

    原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf?   因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...

  5. 5、使用Libgdx设计一个简单的游戏------雨滴

    (原文:http://www.libgdx.cn/topic/49/5-%E4%BD%BF%E7%94%A8libgdx%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E7% ...

  6. Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天、消息模块

    原文:Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天.消息模块 中秋节假期没事继续搞了搞 做了各聊天的模块,需要继续优化 第一步画页面 页面参考https://github.c ...

  7. Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状)

    Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状) 本篇博客来给大家介绍怎样使用Lua这门语言来开发一个简单的小游戏-记数字踩白块. 游戏的流程是这种:在界面上生成5个数1~5字并显 ...

  8. Prism for WPF 搭建一个简单的模块化开发框架 (一个节点)

    原文:Prism for WPF 搭建一个简单的模块化开发框架 (一个节点) 这里我就只贴图不贴代码了,看看这个节点之前的效果 觉得做的好的地方可以范之前的文章看看 有好的建议也可以说说   填充数据 ...

  9. Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单、导航

    原文:Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单.导航 这个实际上是在聊天之前做的,一起写了,也不分先后了 看一下效果图,上面是模块主导航,左侧是模块内菜单,现在加一下隐藏 ...

随机推荐

  1. python列表、元祖、字典

    python列表   ['a','1','vs2']       里面的值可以改 python元祖   ('a','1','css','sdf12')   里面的值不能改 python字典   {'s ...

  2. Visual Studio(VS2012) Project&(Solution) 虚拟文件夹 & 物理文件夹

    今天发生个怪事:在 Solution Explorer 中,x project 内建立文件夹(folder)时,同时在磁盘目录下也创建了同名的文件夹. 1, 原本:应该只是创建一个“虚拟文件夹”用来“ ...

  3. pandas处理数据1

    读文件 pd.read_csv('path/to/file.txt',header=0,names='ab',index_col=0) names Columns这个可以不写,制定索引列是第一列,这样 ...

  4. 实验一 DOS

    实验一.DOS实验 一.           实验目的 DOS(Disk Operating System)是一个使用得十分广泛的磁盘操作系统,就连眼下流行的Windows9x/ME系统都是以它为基础 ...

  5. 团队作业week14

    0 如果你的团队来了一个新队员,有一台全新的机器,你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境, 并成功地把最新.最稳定版本的软件编译出来,并运行必要的单元测试?(在这 ...

  6. 被滥用的for in循环

    众所周知,javascript中有两种for循环,一种是: var a=['this','is','a','article'], i, len; for( i = 0,len = a.length;i ...

  7. 基础笔记10(IO 1.7try-with-resource) 装饰模式

    1.读写的类型分为字节流和字符流,字节流一般是视频音频其他所有的类型都可以. (非文档文件使用字符流易造成未知编码(?)错误) InputStream OutputStream 抽象类 fileInp ...

  8. IOS判断设备是否已越狱

    转自:http://www.cnblogs.com/supercheng/archive/2012/12/05/2804166.html - (BOOL)isJailbroken { BOOL jai ...

  9. WPF界面布局——Canvas

    Canvas用于定义一个区域,称为画布,用于完全控制每个元素的精确位置.它是布局控件中最为简单的一种,直接将元素放在指定位置,使用Canvas时,必须指定一个子元素的位置(相对于Canvas),否则所 ...

  10. 转-阿里云CentOS Linux服务器上用postfix搭建邮件服务器

    http://www.cnblogs.com/dudu/archive/2012/12/12/linux-postfix-mailserver.html 注:本文的邮件服务器只用于发送邮件,也就是ST ...