继续上一部分,游戏的定位是横版平台动作类游戏,所以得有跳跃动作,首先想到的就是物理引擎,不过在2D游戏里,仅为了角色的跳跃而引入物理引擎,目前想来有些不至于,仅使用cocos默认带有的碰撞系统也足够了,所以,至少目前色测试场景下,角色的纵向运动就使用简单的算法来模拟。

思路是这样的:

1. 定义一个恒定的纵向速度,角色一直都拥有此速度,并在脚本的update回调中每次都更新角色位置,效果就是角色会匀速下降。

2. 引入碰撞,给角色分组到Actor,给地面或平台分组到Platform(给节点分组后只保留Actor与Platform之间的碰撞,这样就够了)

3. 配置碰撞回调,碰撞事件发生后角色应该停留在平台上不会继续“掉落”。

4. 增加跳跃动作,做法是给一个纵向的跳跃速度值,在更新角色的纵向位置同时考虑前边提到的恒定速度以及这里的跳跃速度,并在开始跳跃后将跳跃速度逐渐减小至0,就能实现角色的从上升到下落过程了。

5. 平衡角色已有几种动作的搭配与冲突(左右跳跃连续跳跃以及跳跃方向更改限制等)

本次需要做的是纯代码工作,来完善前面的move.js。

1. 添加重力

首先是定义恒定的纵向速度,这里就大言不惭的命名为gravity,并在update的每次回调中更改角色的纵向位置模拟掉落:

this.node.y -= this.gravity * dt;

运行效果就是我们的英雄小白会在屏幕上一直掉落,同时可以左右行动,但也只能决定往左边或是右边掉落,下一步就是让它能稳稳的落在地面上。

2. 停留到地面

现在要先给英雄小白加上碰撞体组件:

给地面也加上碰撞体组件:

然后多复制几个地面来进行跳跃测试,搭好的鬼畜场景像这样:

3. 碰撞事件回调

有了碰撞体后,就能在脚本中配置碰撞事件的回调了,这里只操作碰撞发生事件(onCollisionEnter),此外其实还有碰撞停留事件以及离开事件。

代码如下:

 1 onCollisionEnter: function (other, self) {
2 var otherTop = other.world.aabb.y + other.world.aabb.height;
3 var selfBottom = self.world.aabb.y;
4 // 自身底部与目标顶部的偏移
5 var out = otherTop - selfBottom;
6 // 偏移
7 if(Math.abs(out) < 10) {
8 this.stay = true;
9 this.direction = this.afterJump;
10 this.afterJump = 0;
11 this.node.y += out;
12 }
13 }

要实现的效果并不是超级玛丽那样,可以从下往上撞砖头,而是像冒险岛那样,可以一层一层向上跳跃,下降时才会落在平台上,所以只需要在碰撞进入时计算自身的底部与目标顶部的偏移,在一定值以下则判定为碰撞完成了,需要将角色准确的降落在目标顶部上(这里要设置一个偏差值而不是准确的0是因为碰撞检测系统本身就会有延迟,但是也需要将位置调整准确,即更新node.y的值)。

 4. 增加跳跃动作

现在,横向左、右移动以及“自由落体”三个动作已经有了,要轮到最复杂的一个动作——跳跃了。

跳跃的思路是暂时打破“重力规则”,让角色上升一定位置然后进行自由落体落至平台。

目前的实现即是通过更改jumpSpeed来做到暂时上升,并在update回调中主键恢复jumpSpeed的值,使得重力重新主导纵向运动。

case cc.KEY.alt:
if(this.stay){
this.stay = false;
this.jumpSpeed = this.jump;
this.afterJump = this.direction;
}
break;

其中的afterJump用来决定本次跳跃完成后一瞬间的动作,这个下一部分来讲。

if(!this.stay) {
this.node.y -= (this.gravity - this.jumpSpeed * this.jumpCoefficient) * dt;
if(this.jumpSpeed > 0){
this.jumpSpeed --;
}else if(this.jumpSpeed < 0){
this.jumpSpeed ++;
}
}

通过stay变量来判断是否处于跳跃状态,这样能减少update回调的性能(stay为true时说明没有跳跃,不必考虑纵向运动)。

其中的jumpCoefficient是个跳跃系数,用于放大跳跃的数值。

5. 平衡现有动作的搭配与冲突

下一步得考虑动作之间的冲突了,比如横向左右移动肯定不能同时生效,跳跃前的左右移动将决定本次跳跃的方向,而跳跃过程中由于惯性角色不应该能控制跳跃后自身的移动,在《冒险岛》中还有一个下跳动作,可以支持角色下蹲时跳跃则会降落到下方平台,这个目前暂不实现。实际上本文的跳跃以致整个角色控制的逻辑都还存在瑕疵,有待整改。

首先是横向移动的冲突,最终效果应该是以最后按下的按键为准,也就是左移过程中按右移键则改为右移,左移键不再生效。

纵向的起跳很容易,只要保持当前方向即可,但下落后的移动却需要控制得当。比如,跳跃过程中角色不能再改变移动位置,却可以改变自身的朝向以及决定下落到平台后立即开始的移动方向。这里用一个afterJump变量来预定下落后的位置。

if(Math.abs(out) < 10) {
this.stay = true;
this.direction = this.afterJump;
this.afterJump = 0;
this.node.y += out;
}

下落动作一定也会触发碰撞体的onCollisionEnter回调,只需在此将预定好的afterJump赋值给direction然后重置afterJump即可。

6. 存在的问题

现在的游戏世界还存在很多缺陷,比如:

只要角色不跳跃,就可以在横向任意移动,悬空也可以,比如移动到这个位置:

还有就是cocos的键盘事件的一个机制,或许也是所有键盘输入的机制,也就是按下一个按键不放,按键回调会立即触发一次,然后等待半秒还是更多才会一直保持快速的触发按键回调,这个在输入框打字时感觉是一样的,这就会导致某些时候跳跃结束角色刚落回平台时会迟疑这么个半秒才进行其预定的移动动作(如果落霞后不松开原方向键的话)。

总结是角色的动作控制要考虑完美对于笔者这个不务正业的web从业人员来说还是有些路要走的,不过讲理这个移动控制是个一劳永逸的过程,且对于我们这个横版平台动作游戏来说,引入物理引擎这么庞大的东西或许有其必要或许小题大做,毕竟需要考虑跳跃的就只有角色自己,顶多来一部分特殊怪物拥有角色的移动控制,这也是通用的。再加把劲吧。

PuTsangTo-单撸游戏开发03 碰撞与跳跃瑕疵版的更多相关文章

  1. HTML5游戏开发进阶指南 中文pdf扫描版​

    HTML5游戏开发进阶指南介绍了HTML5游戏开发的一般过程和技巧.全书共分12章,第1章介绍了本书相关的HTML5的诸多新特性,包括在canvas上绘图.播放声音等,另外还引入了子画面页的概念:第2 ...

  2. PuTsangTo-单撸游戏开发01 Flag与计划

    先立下flag,至少1年之内坚持并2年之内完成自己的一个梦想--游戏开发. 没有参加培训也不打算参加培训,就纯靠业余时间自学并用自己的思路完成一整套游戏体系.做出此决心时也已经做好准备烂尾了,但是有种 ...

  3. PuTsangTo-单撸游戏开发02 测试场景与单轴移动

    且不说立项与设计阶段的工作量,一个完整的游戏在开发阶段设计的职责范围也是很广,还有个大问题就是PuTsangTo项目也是本人在边学边做,截止目前还是满满的无从下手的感觉,一方面是技能与经验不足,另一方 ...

  4. PuTsangTo-单撸游戏开发04 给角色添加基本动画

    一. 跳跃与移动的优化与完善 先给上一次的内容做一次补救,也就是上一次中还留存的,由于键盘按键事件的第一次回调与后续回调之间会间隔个小半秒带来的跳跃落地后动作延迟的情况. 最终的键盘按下回调的处理代码 ...

  5. python游戏开发之俄罗斯方块(一):简版

    编程语言:python(3.6.4) 主要应用的模块:pygame (下面有源码,但是拒绝分享完整的源码,下面的代码整合起来就是完整的源码) 首先列出我的核心思路: 1,图像由"核心变量&q ...

  6. 【Unity游戏开发】接入UWA_GOT的iOS版SDK以后无法正常出包

    一.正文 问: RT,最近有看到UWA_GOT工具新增了iOS版本的支持,于是下载了最新的工具包进行了接入测试.是按照文档直接将UWA_GOTv2.0.1_iOS.unitypackage导入进了Un ...

  7. Unity3D游戏开发和网络游戏实战书籍及配套资源和一些视频教程分享

    目录 1. 按 2. pdf 3. 配套资源 3.1. Unity网络游戏实战第二版 3.2. Unity网络游戏实战第一版 4. 视频教程 5. 更多坦克大战代码 1. 按 本文主要分享了: Uni ...

  8. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  9. 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...

随机推荐

  1. IT类非开发面试总结--1

    面试总结.. ================================= 第一部分.. -------------2. 电脑开机时风扇转, 但是屏幕没有任何显示, 此现象可能是哪些方面所导致? ...

  2. PyQt4 初试牛刀一

    建立了一个MainWindow,创建最基本的菜单栏.状态栏.工具栏,并重新定义了"X"关闭的默认行为. # -*- coding: utf-8 -*- import sys fro ...

  3. matplotlib 填充颜色

    def huitu_host(nodes,total): x = np.arange(len(nodes)) plt.figure(figsize=(9,5)) plt.xticks(x,nodes) ...

  4. poj 2763 Housewife Wind (树链剖分)

    题目链接:http://poj.org/problem?id=2763 题意: 给定一棵含n个结点的树和树的边权,共有q次操作,分为两种 0 c :求从位置s到c的距离,然后s变成c 1 a b:把第 ...

  5. Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...

  6. 【Linux部署 · GIT】在linux系统安装git和配置实现SSH

    领导给了一个不开放ftp的测试库,让我部署项目.拿到一个全新的环境,真是个练手的好机会. 该操作系统为:CentOs release 6.5(Final) 由于不开放ftp,所以上传下载代码是非常麻烦 ...

  7. Wireshark使用drcom_2011.lua插件协助分析drcom协议

    drcom_2011.lua是来源于Google code上的一个开源项目中的一个插件,感谢网络大神的分享 需要使用drcom_2011.lua分析drcom协议的话,需要把drcom_2011.lu ...

  8. 如何搭建Zookeeper集群

     ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的 ...

  9. 实现CA证书创建及客户端申请证书

    author:JevonWei 版权声明:原创作品 CA证书的相关文件路径 openssl配置文件/etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf C ...

  10. NHibernate教程(13)--立即加载

    本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制--延迟加载.其本质就是使用GoF23中代理模式 ...