上两周主要给大家介绍了游戏中是如何检测游戏角色和游戏角色和障碍物间的碰撞. 今天回到 mario 继续写我们 super mario 这款游戏.
在开始新的内容之前, 我们需要整理一下前面的代码. 我们看图中的 loadBackgroundSprites 和下面定义的 comp 对象都是应该属于 level(关卡), 因为他们都会关卡息息相关. 关卡包含背景图的组合(这里所谓组合将许多层组合为背景展示给用户)
创建 Level 类, Level 中我们将 compositor(图层组合)游戏角色集合 entities.
介绍一下 ES6 提供了 Set 数据结构. 类似于数组, 但是没有重复值. 下面代码可以帮助大家理解 Set 数据结构.
回到主 (main.JS) 函数, 由于 comp 已经成为 Level 一个属性, 我们就可以删除此行代码.
我们将与 Level 有关的代码移到 Level 类中来整合代码, 已经类的概念, 也就是面向对象编程的终极目标就是复用代码
在 loader.JS 我们对 loadLevel 进行改动, 改动力度很大, 稍一说明. 在读取 JSON 和加载背景 sprite. 两个加载完成后, 我们需要创建 Level 实例, 这个实例提供 comp 和 entities . 我们现在就把 compositor 封装到 Level 类中了. 然后把 Mario 看作 Level 的 entities 集合中的一个.
切换到 layer.JS 文件中, 进行一些调整, 这里内容显然易见, 就不做过多解释了.
修改 main.JS 中代码, 如下图.
现在一切和调整代码之前一样, 除了没有看到主角 mario, 我们要看到 mario 就还需要一些工作, 就是将 mario 添加到 entities 中.
我们把 mario 的 update 方法也移到 Level 这类中, 这样看起来就更合理, 因为所有角色的都在 entities 这个集合中, 所以可以 level 的 update 方法代替 mario(做一个 entity)他自己方法. 然后在 level 的 update 方法中, 我们遍历 entities 然后调用每一个 entity 的 update 方法.
来源: http://www.jianshu.com/p/6a15aaa75dae