Contents
  1. 1. Forward
  2. 2. 变量说明
  3. 3. 实现基本跳跃
  4. 4. 特别说明
  5. 5. 实现二段跳
    1. 5.1. 定义变量
    2. 5.2. phaser的监听方法
    3. 5.3. jump函数
    4. 5.4. debug
  6. 6. 实现二段跳·改
    1. 6.1. debug
  7. 7. 实现多段跳
    1. 7.1. 定义变量
    2. 7.2. update函数更新
    3. 7.3. jump函数更新
  8. 8. END?

刚刚回到学校,整个人都不好了

Forward


一个横版过关游戏,相比于单纯的固定跳跃来说,多段跳能更好的让玩家自由、细致的操作。实现N段跳的过程并不太难,然而在思考的过程中,还是遇到了一些问题。下面是我对这个方法实现的思考过程

变量说明

1
2
3
touching.down // 与下方物体接触 (boolean)
cursor.up // 方向键的上箭头 (Object)
player.body.velocity.y // 玩家的y轴速度 (Number)

实现基本跳跃

玩家的默认操作,与左右行走相同,都是放在update函数(即时更新函数)里的

1
2
3
4
if ( cursors.up.isDown && player.body.touching.down )
{
player.body.velocity.y = -500;
}

特别说明

和东方类游戏的”shift”集中状态一样,所有的操作都是布尔状态量!
例如向左行走,就是打开了velocity.x=-100的开关,而不是触发一次position.x-=100,哪怕位移间隔再小也不行。一个原因是行为的流畅度,第二个原因是计算的需要。
跳跃也是如此,cursors.up.isDown是按下上箭头这个状态,对于我们后续的计算不利,所以我们用原生的事件方法,把跳跃变成事件,这样对于一次按键只会触发一次事件,直到松开按键。

实现二段跳

定义变量

1
var airJump = 2; //剩余跳跃次数,与地面接触即恢复为2

并删去update()中原有的跳跃相关代码

phaser的监听方法

1
2
// now the key is listened (created())
cursors.up.onDown.add(jump);

jump函数

1
2
3
4
5
6
7
8
9
10
11
12
13
function jump () {
// if player touch the groud, jump-times reset
player.body.touching.down && ( airJump = 2 );
switch(airJump){
case 2:
player.body.velocity.y = -500;
airJump = 1;
case 1:
player.body.velocity.y = -400;
airJump = 0;
}
}

debug

这种跳跃方法在平地上测试OK,在平台间测试有bug。
bug原因:由于测试时通过按下Jump来判断位置重置,因此从平台上落下时无法跳跃。
原本是为了性能从而把判断放在jump函数中,在需要跳跃时再去判断当前的位置,因为游戏运行时卡顿严重。后来发现开着调试窗口的原因。
解决了以上问题以后,把判断放在update中时,问题解决。

实现二段跳·改

debug

有一定游戏经验的同学都知道,从平台上落下的时候只能触发二次airJump,而此函数在落下时保留了两段跳。从而导致下落二段跳是玩家能跳的非常远。于是我们把update函数中的

1
player.body.touching.down && ( airJump = 2 );

更正为

1
airJump = player.body.touching.down ? 2 : (airJump == 2 ? 1 : airJump);

用if语句来解释就是

1
2
3
4
5
if (player.body.touching.down) {
airJump = 2;
} else if (airJump == 2) {
airJump = 1;
}

如果是高空落下的情况如果airjump次数为最大值,则让次数减少1。否则保持原来的次数

实现多段跳

按照之前的思路,能够较容易地实现并优化我们的代码。

定义变量

1
2
var maxJump = 3; // 实现N段跳
var airJump; // 剩余跳跃次数

update函数更新

1
airJump = player.body.touching.down ? maxJump : (airJump == maxJump ? maxJump-1 : airJump);

jump函数更新

1
2
3
4
5
6
7
8
function jump () {
// return when jump-times out
if (airJump<1) return;
// the jump-height depends on the jump-times :)
player.body.velocity.y = airJump == maxJump ? -500 : -400;
airJump --;
}

具体跳跃高度你可以用与次数有关的线性方程来决定,也可以像我一样使用固定高度。

END?

说了这么多,然而这只是一个临时替代的方案,最终还是要用状态量去实现多段跳跃。这对于后续维护非常重要。

Contents
  1. 1. Forward
  2. 2. 变量说明
  3. 3. 实现基本跳跃
  4. 4. 特别说明
  5. 5. 实现二段跳
    1. 5.1. 定义变量
    2. 5.2. phaser的监听方法
    3. 5.3. jump函数
    4. 5.4. debug
  6. 6. 实现二段跳·改
    1. 6.1. debug
  7. 7. 实现多段跳
    1. 7.1. 定义变量
    2. 7.2. update函数更新
    3. 7.3. jump函数更新
  8. 8. END?