使用 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

标签: puremvc, cocos2d-js, context

已有 13 条评论

  1. jakey jakey

    强烈关注中,期待part 3.我目前也是参考了博主之前的实现,确实用起来比较复杂。也在考虑重构!!

  2. jakey jakey

    猜想博主 是要考虑使用状态机来维护场景栈吗?

    1. puremvc.js 的这个 statemachine 功能还是比较弱的,只是用它来切换场景而已。不过感觉有点多此一举,暂只是试试。场景栈主要还是由 ContextProxy 和 Command 来维护。

      1. jakey jakey

        期待博主分享你的方案啊~~哈哈

  3. jakey jakey

    博主, part3好久出来啊?非常期待啊

    1. 最近主程回家结婚了,我一个人忙不过来,等有空了再写 :)

  4. jakey jakey

    part3 还会有吗?

  5. 灵车漂移 灵车漂移

    博主,最近也在研究这块的实现方案,能给个联系方式么?谢谢你了,在线等!

  6. louis louis

    请问博主,PART3w什么时候更新,期待你的下一期,获益良多!

    1. 最近这几天会陆续更新几篇,篇幅较长

  7. louis louis

    请问博主,SubMediator如何继续NestMediator,是在puremvc.define内的parent吗?

    1. 是的,parent 属性表示要承继的父类。

  8. qqq qqq

    请问博主,如何用puremvc设计一个带AI的敌人。并且可以通过工厂模式批量创建?

评论已关闭