我们在游戏开发中经常要考虑场景的管理,今天小编为大家介绍一个场景管理的开源解决方案,本篇教程将详细介绍这个场景管理的解决方案,希望各位同学能有所收获。
CocosBase是基于Cocos2d-x移动跨平台游戏引擎的一套场景管理、消息管理、事件管理等开源解决方案
CocosBase的出现,完全改善了引擎场景管理上的不足与缺陷,与引擎本身也是完美结合。对于本身需求有二次封装的团队是一种标准解决方案。CocosBase改善了引擎场景切换的方式与定义,使之更方便简洁,拓展性更强。增加了消息广播机制,触摸事件优先级管理机制,接下来Viva将逐步介绍。
场景管理改善:
与引擎本身不同的是,CocosBase拓展了NotificationNode接口,使游戏本身由1个渲染树(Scene渲染树)变为2个渲染树:
基础场景渲染树(Scene渲染树)
悬浮场景渲染树(NotificationNode渲染树)
分为两条渲染树的理由:
在一般的rpg游戏里,大可抽象场景为游戏场景与UI场景,
游戏场景富含了所有游戏的内容玩家、npc、怪物等等。
UI场景则可以理解为背包系统、强化系统、好友系统等等。
为了把两种场景类型抽象出来分别处理,则出现了上文所说的两条渲染分支。
悬浮场景将永远呈现在基础场景之上,悬浮场景的切换不会影响基础场景,基础场景的切换也同样不会影响悬浮场景
如果2条渲染树让大神您觉得很不爽,那您完全可以只用一条渲染树(相当于引擎本身的方式)
管理基础场景渲染树的接口:
管理悬浮场景渲染树的接口:
关于引擎提供的场景的切换动画(CCTransitionScene) 目前只有基础场景支持切换动画,如果大神您非要悬浮场景也支持,那Viva给您提供一个方案去实现,可以在悬浮场景的onEnter与onEnterTransitionDidFinish这两个回调函数里去做些事情。
场景扩展类介绍
目前在2dx2.0版本里扩展场景类名:CCSceneEx
基础场景与悬浮场景的定义,都需要从CCSceneEx继承而来。
CCSceneEx API:
onLoadResources()
当场景被初次创建时 在此方法内部初始化场景所需要的资源
目前支持图片的加载
同步方式:addImage()
异步方式:addImageAsync()
当所有资源成功加载后 会调用onLoadResourcesCompleted
仅初始化时回调一次
onLoadResourcesCompleted()
当场景内的资源被成功加载后 回调此方法
同步加载后立即回调 如果存在异步方式
则异步加载完成后回调
仅初始化时回调一次
onLoadScene()
场景资源加载完成后会调用此接口 用于
初始化场景内所有元素
仅初始化时回调一次
isCachable()
覆盖此函数来指定本场景是否缓存
getExtraObject()
获取场景切换时传递的附加参数
getTouchPriority()
获取场景管理器在本场景onEnter时为本场景分配的触摸优先级
Viva为您提供的触摸优先级解决方案,在onLoadScene里初始化所有元素(CCMenu、CCLayer、CWidgetLayout等需要接收触摸事件的对象)
本场景在onEnter时总会得到一个最新的优先级值(最优先的)
所以在onEnter时,来刷新这些元素(CCMenu、CCLayer、CWidgetLayout)的触摸优先级,触摸优先级的值通过getTouchPriority来获得
这样就能保证,本场景在显示时(加入渲染树时),优先级被重置为最优先了。
addImage()
以同步的方式加载图像资源
addImageAsync()
以异步的方式加载图像资源
场景定义介绍
1. CREATE_SCENE_FUNC 这个宏写在每个场景定义的头文件里
2. REGISTER_SCENE_FUNC 用这个宏 通过场景类名来注册场景(一般写在AppDelegate.cpp里)
3. SeekScene 通过场景类名查找场景实例
4. SeekSceneExtra 通过场景类名查找场景实例 并传递参数
通过这样的代码来注册一个场景(一般写在AppDelegate.cpp里)
REGISTER_SCENE_FUNC(LoginScene);
通过这样的代码来运行一个场景
CCDirectorEx::sharedDirector()->runWithScene(SeekScene("LoginScene"));
消息广播机制:
所有CCObject对象均可以通过多继承于CCMessageProtocol接口类来实现接收消息的功能(CCSceneEx默认多继承于CCMessageProtocol)
registerMessageHandler(CCMessageProtocol* pProtocol)
注册一个消息接收器
unregisterMessageHandler(CCMessageProtocol* pProtocol)
取消注册一个消息接收器
通过以下代码来注册消息接收
CCDirectorEx::sharedDirector()->registerMessageHandler(this);
发送消息接口
通过以下代码来发送消息
CCDirectorEx::sharedDirector()->PostMessage(1, pBundle, NULL, NULL);
发送消息的时机可以是任何时间任何地方,发送的消息会在下一帧时进行分发。
另外消息结构中有一个参数pMsgObj,只要保证发送的参数是create出来的(调用过autorelease),即可再也不用理会这个对象的生命周期
其他两个对象指针wParam与lParam,需要自己处理释放等操作。
导演拓展类介绍
CCDirectorEx
end()
退出游戏
getRunningScene()
获取当前运行的基础场景
getRunningPopupScene()
获取当前运行的悬浮场景
removeCachedScenes(const char* pSceneName)
移除指定缓存场景,通过场景类名
removeAllCachedScenes()
移除所有缓存场景
removeUnusedCachedScenes()
移除所有计数为1的场景,相当于是移除没有在运行栈里的场景
getTouchPriority()
获得触摸优先级 每次调用减1,在场景onEnter时,会为场景分配一次
lockTouchEvent()
锁定触摸操作
unlockTouchEvent()
解锁触摸操作
本文就写到这里,CocosBase的诞生是为了帮助各位主程大神来搭建自己的开发框架、开发平台。CocosBase提供的是一种管理模型、设计模式,并不一定完全适合您的团队。只有适合您团队的架构设计,才能有效的调配工作,加速进度,掌握游戏逻辑走向,为的是低耦合高内聚,mvc。
¥698.00
¥98.00
¥98.00
¥108.00