使用 PureMVC 和 Cocos2d-js 构建游戏项目 II
去年九月份写了一篇《使用 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 。于是我正好借此机会将新想法融入到新的框架中。
在新的框架中,我增加了 Context(上下文)的数据域,用于储放状态和层级关系。每一个 Context 对应一个 Mediator ,可用于恢复场景;并且使用 ContextProxy 维护根 Context 列表也就是所谓的场景栈。然后将原来 Mediator 处理层级的逻辑全部转移到 Command 中,这样一来,Mediator 如释重负,可以专心于处理 View 层的事情了。
项目的结构我在上一篇《cococs2d-jsList》的末尾彩蛋中给出。具体的思路,等我另开一篇 part 3 再详述吧。
¶2015/08/25 updated:
- 后续文章 使用 PureMVC 构建游戏项目 III
- 后续文章 使用 PureMVC 构建游戏项目 IV