PuTsangTo-单撸游戏开发03 碰撞与跳跃瑕疵版
继续上一部分,游戏的定位是横版平台动作类游戏,所以得有跳跃动作,首先想到的就是物理引擎,不过在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 碰撞与跳跃瑕疵版的更多相关文章
- HTML5游戏开发进阶指南 中文pdf扫描版
HTML5游戏开发进阶指南介绍了HTML5游戏开发的一般过程和技巧.全书共分12章,第1章介绍了本书相关的HTML5的诸多新特性,包括在canvas上绘图.播放声音等,另外还引入了子画面页的概念:第2 ...
- PuTsangTo-单撸游戏开发01 Flag与计划
先立下flag,至少1年之内坚持并2年之内完成自己的一个梦想--游戏开发. 没有参加培训也不打算参加培训,就纯靠业余时间自学并用自己的思路完成一整套游戏体系.做出此决心时也已经做好准备烂尾了,但是有种 ...
- PuTsangTo-单撸游戏开发02 测试场景与单轴移动
且不说立项与设计阶段的工作量,一个完整的游戏在开发阶段设计的职责范围也是很广,还有个大问题就是PuTsangTo项目也是本人在边学边做,截止目前还是满满的无从下手的感觉,一方面是技能与经验不足,另一方 ...
- PuTsangTo-单撸游戏开发04 给角色添加基本动画
一. 跳跃与移动的优化与完善 先给上一次的内容做一次补救,也就是上一次中还留存的,由于键盘按键事件的第一次回调与后续回调之间会间隔个小半秒带来的跳跃落地后动作延迟的情况. 最终的键盘按下回调的处理代码 ...
- python游戏开发之俄罗斯方块(一):简版
编程语言:python(3.6.4) 主要应用的模块:pygame (下面有源码,但是拒绝分享完整的源码,下面的代码整合起来就是完整的源码) 首先列出我的核心思路: 1,图像由"核心变量&q ...
- 【Unity游戏开发】接入UWA_GOT的iOS版SDK以后无法正常出包
一.正文 问: RT,最近有看到UWA_GOT工具新增了iOS版本的支持,于是下载了最新的工具包进行了接入测试.是按照文档直接将UWA_GOTv2.0.1_iOS.unitypackage导入进了Un ...
- Unity3D游戏开发和网络游戏实战书籍及配套资源和一些视频教程分享
目录 1. 按 2. pdf 3. 配套资源 3.1. Unity网络游戏实战第二版 3.2. Unity网络游戏实战第一版 4. 视频教程 5. 更多坦克大战代码 1. 按 本文主要分享了: Uni ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...
随机推荐
- go web 第三天 学习笔记 --mysql
CREATE TABLE `userinfo` ( `uid` INT() NOT NULL AUTO_INCREMENT, `username` VARCHAR() NULL DEFAULT NUL ...
- 转每天一个linux命令(8):cp 命令
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...
- 23个适合Java开发者的大数据工具和框架
转自:https://www.yidianzixun.com/article/0Ff4gqZQ?s=9&appid=yidian&ver=3.8.4&utk=6n9c2z37 ...
- 理解javascript 对象,原型对象、闭包
javascript作为一个面向对象的语言,理解 对象.原型.闭包.模块模式等技术点对于成为一名合格的javascript程序员相当重要,多年没写过blog,今天就先拋个玉,在下基本也不做前端,但颇感 ...
- 第二篇--Jmeter测试Java请求
前提:需要准备eclipse作为开发工具,安装jdk,准备完毕,接下来开工喽! 1.新建Java工程BMIrisJNIJarTest,新建lib目录,将Jmeter安装目录下lib/ext包下的Apa ...
- Python+Requests接口测试教程(2):
开讲前,告诉大家requests有他自己的官方文档:http://cn.python-requests.org/zh_CN/latest/ 2.1 发get请求 前言requests模块,也就是老污龟 ...
- split添加limit参数
String str = "I love you"; /**这里被分割为I 和love you**/ String[] spiltStr = str.spit(" &qu ...
- 谈一谈EasyUI中TreeGrid的过滤功能
写在最前面 这个星期一直在纠结easyui的treegrid的过滤功能,原因呢,自然是项目中一个莫名奇妙的需求. easyui虽说是后端程序员的前端框架,但是说句实话,除去api,让我直接写里面的节点 ...
- 阿里云centos下安装nginx、jdk、tomcat、绑定域名、解析域名
1.ESC后安全设置(管理控制台->本实例安全组->配置规则->添加安全组规则->3306.80端口配置) 2.nginx 安装,首先安装三大件 PCRE.zlib.ope ...
- 三,ESP8266 SPI
重点是说SPI通信协议,,,, 不要害怕协议因为协议是人规定的,,刚好我也是人......规定的协议既然能成为规范让所有人所接受,那么必然有它的优势和优点,必然值得学习,, 害怕协议的人是因为当初碰到 ...