再开始今天新的内容前,我们来修正两个错误。
第一个是我们为重力补上 deltaTime。然后适当地调整 gravity 值,由于我们重力值给了 30 这时候,mario 会一下跳的很高。我们来加大重力值控制 mario 高度。
调整更新(update)和绘制(draw)方法的先后顺序。
我看先一下如何添加键盘事件,然后输出 event 对象,看一看 event 上有什么属性。
事件里有很多属性,我们这里只关心两个属性 code 和 keyCode。这里我们希望每次按下和松开按键为一个动作,而不是当按住键时一直执行这个按键对应的动作,对于射击,可能需要按下按键一直处理某个动作。
接下来我们开始创建 keyboardState 类,然后添加 addMapping 和 handleEvent 方法,具体内容看图中注释吧。
我们用 preventDefault 方法来阻止浏览器的默认行为,举个例子,当按下 pagedown 按钮件浏览器会向下翻页。
添加两个静态变量,通过 0 和 1 分别表示键盘事件的状态。
handleEvent 方法中,我们首先判断该键盘事件是否已经注册到 keyMap,如果没有注册,直接返回。根据 event 的类型 type 获取当前键盘事件状态。判断键盘事件状态是否改变,没有改变也会直接返回。如果状态改变,会先存储键盘事件的状态,最后执行该键盘事件的状态所对应的回调。
添加 listenTo 用于将事件注册到 window 对象上。
我们还需要监听 keyup 事件,调整代码,遍历要监听的事件。
测试一下刚刚创建好的 Keyboard 类,32 为空格键对应 keyCode 码。
我们将 input 这部分代码整理到如图中的位置,然后定义当玩家按下空格键,mario 所做的动作。我们先在这里预定两个方法,分别是 jump 特性的 start 方法和 jump 特性的 cancel 方法。
在 Entity 中添加一个属性 traits, 这个属性是一个 trait (特性)的集合,也就是 Entity 具有哪些特性,然后提供一个可以添加特性的方法。this[trait.Name] 我们可以通过特性名称来调用到这个 trait 特性。
定义 Trait 类,trait 因为原意是特点,特性意思,可能本领更贴切些。在构造函数需要给出特征的名称,然后必须实现 update 方法。
创建一个 Velocity 类来继承 Trait 类,大家可以把 Trait 想象为抽象类,我们需要把这部分代码迁移到 Velocity 的 update 方法中。
然后在 mario 中,将 Velocity 添加到他的 trait 本领中,这里 trait 也可以理解为本领,这里将 trait 翻译为本领或技能可能也挺贴切的。
我继续创建 mario 的跳跃本领,创建 Jump 类。
start 方法,我们将投入时间赋值为预定的 duration 的时间。
然后 update 方法中,当投入时间(engageTime 大于 0 时)减少 mario y 轴上值,让 mario 向上运动,同时递减投入时间。
cancel 方法:将投入时间设置为 0 ,这时 mario 就没有向上运行的趋势了。
将 jump 添加到 mario 的本领列表。
刷新界面,当按下空格键,看 mario 会不断跳起。
网友评论