美文网首页程序员
小游戏开发 Mario (6)

小游戏开发 Mario (6)

作者: zidea | 来源:发表于2018-11-28 21:12 被阅读7次

    再开始今天新的内容前,我们来修正两个错误。

    第一个是我们为重力补上 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 会不断跳起。

    相关文章

      网友评论

        本文标题:小游戏开发 Mario (6)

        本文链接:https://www.haomeiwen.com/subject/qnkpfqtx.html