Web/Game/Programming/Life etc.
许多游戏引擎已经提供了原生的场景管理功能,例如 Cocos2d-x 的 CCDirector.replaceScene()
或者 Unity3d 的 Application.loadLevel()
。场景切换的本质是将原有的对象删除并从内存中释放,腾出空间然后加载新的场景资源。但这并不能满足当下的一些需求,简单的从将一个场景销毁,进入下一个场景,而想要点击返回的时候,回退到原来的界面,并不是简单重新加载一下原来的界面就可以了,还需要还原当时现场的一些关键状态(详细的需求见 Part I)。
所谓的关键状态就是,例如:
你在进入装备界面,默认显示所有装备(type = all),然后你点击界面上的分类按钮,按类型B(type = B)进行筛选。然后你从装备界面跳转到关卡界面(准备去相应的关卡打装备),打完后你想回到装备界面时,它还按类型 B 而不是默认 all 进行筛选。那么 type 就是一个关键状态。
在手机游戏中,场景指的是那些独占整个屏幕的模块;此外还有一些模块是浮动于场景之间的,类似于层,可以弹出和关闭。在 Part III 的 Mediator 部分,我描述了两种类型的视图组件(ViewComponent):一种是 Scene;另一种是 Layer。在 Part I 中,我将这两种类型的 View 区别开来:NestMediator 和 SubNestMediator。由于我觉得这些 Mediators 是一种嵌套关系(类似 CCNode),所以在做场景恢复的时候,我认为等 Mediator 创建并加载 ViewComponent 后遍历子节点,逐层恢复就可以了。但这导致 Part II 中提到的 Mediators 相互引用,并且有大量场景切换和还原的逻辑被放在 NestMediator 中。
后来我重新审视了这个设计,发现虽然可行,但有太多不合理的地方。现将新的方案整理如下:将状态和场景树转移到 Contexts 中储存,使用 Commands 来处理 Mediator 和 ViewComponent 的注册与销毁,而场景实际切换过程交给 SceneManager 处理。
更新于 2015/10/13: ulua 最新版已经直接支持 mac 调试:ulua怎么与ZeroBrane Studio联合调试?
ulua 是一款 unity3d 4.6/5.1 插件,能够使用 lua 语言进行 unity3d 游戏开发。但使用嵌入式脚本语言进行游戏开发带来便利的同时也对调试程序也带来了各种考验。
有幸找到 MobDebug ,一款用于远程调试 Lua 的神器。集服务端与客户端于一身,集成于多种 Lua IDE 中,例如 ZeroBrane Studio 。于是我打算尝试使用 ZeroBrane Studio 对运行中的 ulua 进行远程调试。
去年九月份写了一篇《使用 PureMVC 和 Cocos2d-js 构建游戏项目》,阐述了在 cocos2d-js 中使用 PureMVC 框架的想法,并在项目中试水后感觉效果也比较理想。但是整个框架中令我最不满意的两点就是直接在 Mediator 中处理层级和场景栈以及保存状态。
对于前者,官方的《PureMVC 最佳实践》一书里曾提到:
Page.28 虽然 Mediator 可以从 View 获取其他的 Mediator, 通过 API 访问、操作它们。但这样是很不好的, 它会导致 View 下成员的相互依赖, 这违反了“改变一个不影响其他”的目的。
之前设计的框架中处理层级的逻辑是在基类(NestMediator)中实现的。框架中的所有界面相关的 Mediator 子类都继承它。使用的操作也只涉及基类开放的 API 。而各个子类之间不再有其它的关联。但即使是这样,心里还是感觉不舒坦。
对于后者,使用 Mediator 保存状态以便出栈的时候恢复场景使用——这是当时感觉比较有创意的想法。但是后来仔细想想状态应该是属于 Model 层维护的东西才对啊。放在栈里的应该是数据,而不是 Mediator 。
当前的项目越做越复杂,一直找不到一个合适的契机进行重构,所以只能寄希望于新的项目了。正好近期公司有其它项目组准备启动新的游戏项目,也打算使用 Cocos2d-js + PureMVC 来进行开发,希望我能够提供个框架的 DEMO 。于是我正好借此机会将新想法融入到新的框架中。
cocos2d-jsList 是一个用来自动生成用于 cocos2d-js/cocos2d-html5 代码列表(jsList)的小工具。jsList 位于 project.json
中,用来指明 cocos2d-js 项目代码的加载顺序,详情可见官方文档。
由于众所周知的原因,要处理 cocos2d-js 的 js 依赖并不容易,很多项目依然使用最原始的方式进行开发,而不是使用模块化管理。所以还是需要手动维护 jsList 列表来处理代码依赖(例如类继承)。
为了减少一些工作量和手动处理带来的失误,于是我写了 cocos2d-jsList 这个小工具。