下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Cocos2D-X场景教程:场景管理解决方案

作者:课课家教育     来源: http://www.kokojia.com点击数:1174发布时间: 2019-03-28 10:07:02

标签: Cocos2D-X场景Cocos2D-X教程Cocos2D-X解决方案

  我们在游戏开发中经常要考虑场景的管理,今天小编为大家介绍一个场景管理的开源解决方案,本篇教程将详细介绍这个场景管理的解决方案,希望各位同学能有所收获。

  CocosBase是基于Cocos2d-x移动跨平台游戏引擎的一套场景管理、消息管理、事件管理等开源解决方案

  CocosBase的出现,完全改善了引擎场景管理上的不足与缺陷,与引擎本身也是完美结合。对于本身需求有二次封装的团队是一种标准解决方案。CocosBase改善了引擎场景切换的方式与定义,使之更方便简洁,拓展性更强。增加了消息广播机制,触摸事件优先级管理机制,接下来Viva将逐步介绍。

  场景管理改善:

  与引擎本身不同的是,CocosBase拓展了NotificationNode接口,使游戏本身由1个渲染树(Scene渲染树)变为2个渲染树:

  基础场景渲染树(Scene渲染树)

  悬浮场景渲染树(NotificationNode渲染树)

  分为两条渲染树的理由:

  在一般的rpg游戏里,大可抽象场景为游戏场景与UI场景,

  游戏场景富含了所有游戏的内容玩家、npc、怪物等等。

  UI场景则可以理解为背包系统、强化系统、好友系统等等。

  为了把两种场景类型抽象出来分别处理,则出现了上文所说的两条渲染分支。

  悬浮场景将永远呈现在基础场景之上,悬浮场景的切换不会影响基础场景,基础场景的切换也同样不会影响悬浮场景

  如果2条渲染树让大神您觉得很不爽,那您完全可以只用一条渲染树(相当于引擎本身的方式)

  管理基础场景渲染树的接口:

Cocos2D-X场景教程:场景管理解决方案_Cocos2D-X场景_Cocos2D-X教程_Cocos2D-X解决方案_课课家

  管理悬浮场景渲染树的接口:

  关于引擎提供的场景的切换动画(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。

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程