在上一篇《Canvas制作时间与行为可控的sprite动画》中已经实现了角色的左右移动,本篇继续实现角色的一系列动作之一:跳跃。先来看看最终效果:

要实现跳跃,必须模拟垂直方向的速度和重力加速度,由于Canvas中坐标系与平时见到的平面坐标系不同,向下为正,向上为负,故定义两个变量:

var vy = -12;    //垂直方向的速度,负代表向上
var gravity = 0.5; //重力加速度

另外,还需要一些变量来标记角色的状态:

var onGround = true,    //标识角色是否在地面上
jumping = false, //标识角色是否处于跳跃中
keyPressCounter = 0; //键盘锁,防止连发

跳跃过程的实现可以复习之前写过的一篇文章《Chrome自带恐龙小游戏的源码研究(六)》,这里就直接贴出代码:

if (key[32]) { //按下空格跳跃
if (keyPressCounter++===1) {//防止连发
//只有角色在地面并且处于非跳跃状态时才执行跳跃动作
if (onGround && !jumping) {
//更新状态为准备起跳
playerState = 'readyToJump';
jumping = true; //跳跃中
onGround = false; //离地
vy = -12; //跳跃初始速度
}
} else {//此分支表示一直按住跳跃键的情况
//根据角色垂直速度来更新角色所处的状态
if (vy <= 0 && !onGround) {
playerState = 'isUp'; //上升中
} else if (vy > 0 && !onGround) {//下降中
playerState = 'isDown';
} else if (onGround) {
//在地面的情况下,如果同时按住跳跃和移动,
//将动作设置为move。
if (!key[65] && !key[68]) playerState = 'idle';
else playerState = 'move';
}
}
} else { //此分支表示没有按下跳跃键时
keyPressCounter = 0; //将连发计数器归零
vy = Math.max(vy, -6); //设置下落速度
jumping = false; //更新标识为非跳跃状态 //根据角色垂直速度来更新角色所处的状态
if (vy <= 0 && !onGround) {
playerState = 'isUp';
} else if (vy > 0 && !onGround) {
playerState = 'isDown';
}
} vy += gravity; //与重力相加来得到最终速度
y += vy; //更新yPosition

二段跳

  二段跳(Double Jump)是一个游戏术语,顾名思义,就是允许角色在空中进行两次跳跃,维基百科中给予了比较明确的定义:a common mechanic in video games which allows the player's character to jump for a second time whilst still in mid air。二段跳可以使角色抵达更高的高度,丰富了游戏的可玩性,而其实现也非常简单。首先需要一个标识表示允许二段跳:

var canDoubleJump = true;

其次,在刚才跳跃的代码中添加如下代码:

if (keyPressCounter++===1) {
if (onGround && !jumping) {
playerState = 'readyToJump';
jumping = true;
onGround = false;
canDoubleJump = true;
vy = -12;
} else {
if (canDoubleJump) {
//二段跳进行后禁止再次跳跃
canDoubleJump = false;
//重新设置起跳速度
vy = -12
;
}
}

}

最终效果已更新至《Canvas制作时间与行为可控的sprite动画》中。

HTML5 2D平台游戏开发#2跳跃与二段跳的更多相关文章

  1. HTML5 2D平台游戏开发#4状态机

    在实现了<HTML5 2D平台游戏开发——角色动作篇之冲刺>之后,我发现随着角色动作的增加,代码中的逻辑判断越来越多,铺天盖地的if() else()语句实在让我捉襟见肘: 这还仅仅是角色 ...

  2. HTML5 2D平台游戏开发#6地图绘制

    此前已经完成了一部分角色的动作,现在还缺少可以交互的地图让游戏看起来能玩.不过在开始之前应当考虑清楚使用什么类型的地图,就2D平台游戏来说,一般有两种类型的地图,Tile-based和Art-base ...

  3. HTML5 2D平台游戏开发#11斜坡物理

    在游戏中会经常遇到斜坡地形,比如众所周知的魂斗罗,角色可以在坡上移动和跳跃: 斜坡在2D游戏中很常见,处理起来也较为棘手.最初我打算用分离轴定律来实现,在建立了一个物理模型之后: 发现上坡时没什么问题 ...

  4. HTML5 2D平台游戏开发#8指令技

    一般在动作游戏中,玩家可以通过对输入设备输入一系列的指令让角色完成某个或多个特定的动作.以格斗游戏<拳皇>为例,键入↓↘→↘↓↙← + A or C可以触发IORI的必杀技八稚女: 通过一 ...

  5. HTML5 2D平台游戏开发#7Camera

    在庞大的游戏世界中,玩家不能一览地图全貌,而是只能看到其中一部分,并一步步探索,这时就要用到一种技术来显示局部的地图,游戏术语称为摄像机(Camera).下面两张图中的白色矩形框表示了Camera的作 ...

  6. HTML5 2D平台游戏开发#5攻击

    目前为止,角色除了基本的移动外还什么都不能做,于是我打算先实现角色的攻击动画.角色的普通攻击一共可以分为三个阶段: 一段斩 二段斩 三段斩 移动攻击 跳跃攻击 触发方式为角色站立时按下J(攻击)键,角 ...

  7. HTML5 2D平台游戏开发#10Wall Jump

    这个术语不知道怎么翻译比较贴切,但并不妨碍对字面意思的理解,大概就是飞檐走壁.比如: 这是游戏<忍者龙剑传>中的场景,玩家可以通过操纵角色在墙面上移动并跳跃. 首先需要实现角色抓墙这一动作 ...

  8. HTML5 2D平台游戏开发#9蓄力技

    在很多动作游戏中,玩家操控的角色可以施放出比普通攻击更强力的蓄力技,一般操作为按住攻击键一段时间然后松开,具体效果像下面这张图: 要实现这个操作首先要记录下按键被按住的时间,初始是0: this.sa ...

  9. HTML5 2D平台游戏开发#1

    在Web领域通常会用到一组sprite来展示动画,这类动画从开始到结束往往不会有用户参与,即用户很少会用控制器(例如鼠标.键盘.手柄.操作杆等输入设备)进行操作.但在游戏领域,sprite动画与控制器 ...

随机推荐

  1. Bits

    先%SY... 课件链接 求1的个数 以32位整数为例子,最暴力的方法就是一位一位的数,但是这样太不优美... 以下是优美的方法... 这个问题其实就是二进制求和... 我们考虑分治的思想...每一次 ...

  2. xCode控制台的使用-应用闪退原因跟踪

    xCode控制台的使用-应用闪退原因跟踪 今天遇到这个一个问题,使用xCode version = 5.0 编译一个程序,刷到IOS7设备后,应用运行正常,但是刷新到IOS<7,打开饮用后就会出 ...

  3. 利用GridView控件导出其他文件(导出Excel,导出Word文件)

    原文发布时间为:2008-10-16 -- 来源于本人的百度文章 [由搬家工具导入] // 注意,在Visual Studio2005平台下,如果使用GridView导出文件,      //就必须重 ...

  4. 转载——Java与WCF交互(二):WCF客户端调用Java Web Service

    在上篇< Java与WCF交互(一):Java客户端调用WCF服务>中,我介绍了自己如何使用axis2生成java客户端的悲惨经历.有同学问起使用什么协议,经初步验证,发现只有wsHttp ...

  5. 洛谷——P1617 爱与愁的一千个伤心的理由

    P1617 爱与愁的一千个伤心的理由 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第二章. 经历了心痛后,爱与愁大神不行了. 题目描述 ...

  6. Inno Setup打包的安装程序在Vista/Win7上自动提示需要管理员权限的方法

    来源:http://hi.baidu.com/jingrensoft/blog/item/c34575cfae4fb926f9dc617f.html 首先,在 [Setup]段 PrivilegesR ...

  7. mac python 切换系统默认版本

    1 找到所安装python路径/usr/local/Cellar/python/2.7.13/bin2 vim ~/.bash_profile 3 添加如下代码: PATH="/usr/lo ...

  8. 国家商用password(五)基于SM2的软件授权码生成及校验

    将公开密钥算法作为软件注冊算法的优点是Cracker非常难通过跟踪验证算法得到注冊机.以下.将介绍使用SM2国密算法进行软件注冊的方法. 生成授权码 选择SM2椭圆曲线參数(P,a,b,N,Gx,Gy ...

  9. 优化算法——拟牛顿法之L-BFGS算法

    一.BFGS算法 在"优化算法--拟牛顿法之BFGS算法"中,我们得到了BFGS算法的校正公式: 利用Sherman-Morrison公式可对上式进行变换,得到 令,则得到: 二. ...

  10. 手机APP脚本录制(LoadRunner 12)

    最近因项目需要,研究了下手机APP脚本录制方法,有需要的童鞋可参考使用! 方法1: 在手机网络中设置网络代理,使用LR12选择Mobile Application – HTTP/HTML协议中代理录制 ...