一个简单的游戏开发框架(四.舞台Stage)
首先是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)的更多相关文章
- 一个简单的游戏开发框架(七.动作Motion)
发现还没谈到最基本也是最重要的问题,怎么画图,画动画? 在原版cocos2d-x里画动画比较麻烦,见cocos2d-x学习笔记04:简单动画 cocostudio扩展出CCArmature类,就比较简 ...
- 一个简单的游戏开发框架(五.对象Object)
前面提到我们把行为Action从对象Object中分离了出来,用各种不同的行为组合出对象的功能.大家都知道,面向对象的一个类,就是数据和操作的集合.操作(行为)被分离出来了,数据怎么办呢?操作依赖的数 ...
- 一个简单的游戏开发框架(六.行为Action)
Action是cocos2d-x中比较重要的概念,有一个庞大的类族.参见老G写的cocos2d-x学习笔记09:动作2:持续动作 除了各种包装器,剩下的主要是一些持续动作: CCMoveTo:移动到. ...
- Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token
原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf? 因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...
- 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% ...
- Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天、消息模块
原文:Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天.消息模块 中秋节假期没事继续搞了搞 做了各聊天的模块,需要继续优化 第一步画页面 页面参考https://github.c ...
- Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状)
Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状) 本篇博客来给大家介绍怎样使用Lua这门语言来开发一个简单的小游戏-记数字踩白块. 游戏的流程是这种:在界面上生成5个数1~5字并显 ...
- Prism for WPF 搭建一个简单的模块化开发框架 (一个节点)
原文:Prism for WPF 搭建一个简单的模块化开发框架 (一个节点) 这里我就只贴图不贴代码了,看看这个节点之前的效果 觉得做的好的地方可以范之前的文章看看 有好的建议也可以说说 填充数据 ...
- Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单、导航
原文:Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单.导航 这个实际上是在聊天之前做的,一起写了,也不分先后了 看一下效果图,上面是模块主导航,左侧是模块内菜单,现在加一下隐藏 ...
随机推荐
- Javascript运用函数计算正方形的面积
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 命令行用sublime打开当前目录
执行 ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" subl 就可以在命令行用 ...
- led灯的翻转函数
定义: uint8_t led1_val; void LED1(uint8_t* val){ *val =!(*val); if( *val == 0x00 ) HAL_GPIO_WritePin ( ...
- java中Array/List/Map/Object与Json互相转换详解
http://blog.csdn.net/xiaomu709421487/article/details/51456705 JSON(JavaScript Object Notation): 是一种轻 ...
- 用struts实现简单的登录
1.建项目时选java EE6.0 2.写登陆界面 <body> <center> <form id="form1" name="form1 ...
- 禁止手机页面中A标签长按弹出路径框
//禁止手机页面中A标签长按弹出路径框 window.onload=function(){ document.documentElement.style.webkitTouchCa ...
- VMware Workstation 10+Centos7(64位)共享文件夹
这一两天一直在研究VMware Workstation自带的共享文件夹的功能,期间出了不少问题,在公司搭建的是vm10.0+centos07,在家搭建的是VM 7+centos07... 公司环境搭建 ...
- checkbox点击后出现div
HTML: <div class="msg_editUrl_function"> <label class="labelChecked" fo ...
- windows7 64,32位下scrapy爬虫框架的环境搭建
适用于python 2.7 64位安装 一.操作系统:WIN7 64位 二.python版本:2.7 64位(scrapy目前不支持3.x) 不确定位数的,看图 三.安装相关软件:(可以从我的百度网盘 ...
- SpringMVC拦截器(资源和权限管理)
1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet. DispatcherServle ...