⑴ cocos物理引擎碰撞难不难
难。
1、在cocos游戏开发的过程中,物理引擎碰撞物体检测处理极其重要,所以对其细节的要求极其高。
2、当有碰撞发生的时候,遍历刚体所在的节点所挂的所有的组件要求百分之百的正确。
⑵ CocosCreator初体验
机缘巧合,最近接到关于游戏的需求,前后调研了一下Unity3D和CocosCreator,但是考虑到是作为项目的一部分而使用,并且局限于Unity3D的使用条款,为了避免法律问题,最后选择的是使用CocosCreator来实现。第一次接触Unity3D和CocosCreator这类的游戏引擎,大约用了一个月的时间,从学习到项目大部分完成,之后要打包成静态库供其他客户端的同事们使用。学习途径主要是CocosCreator官网文档和官方Demo(看中文的文档就是爽!!!)。本片文章的目的主要是记录一下过程中遇到的问题及解决方案,并不是完整的教程。
本次要做的是一个最简单的跑酷类游戏,无需使用Tiled(地图编辑器),spine(骨骼动画编辑器)。也是做了这个小游戏才发现游戏其实已经发展的很成熟了。
我们可以看到,元素很简单,背景主要有远景、中景,通过设置不同的速度来实现现实中跑动的效果。主要的逻辑实现部分是在前景的任务和障碍物。由于没有使用物理引擎,所以是直接使用CocosCreator的碰撞检测实现的。主人公可以跳跃越过障碍物,撞开障碍物,收集金币。按住屏幕,hero跳起,按的时间长一些,主人公的跳跃也会高一些,自然一些的话还是需要简单的物理公式的。正常情况下hero是在x轴上是没有速度的,一种情况是当障碍物挡住hero时会有一个和障碍物同样的速度模拟阻挡的效果,还有一种情况是阻挡产生之后hero产生了位置上的移动,需要一个速度回到原位置。由于CocosCreator提供了碰撞检测之后的回调函数,所以我们可以很轻松的在回调中做一些相关操作,比如让碰到的金币消失之类的。
有位同事做过cocos2d-x的开发,使用的c++,向他请教了一些基础了知识,但是细节上跟cocosCreator相差恨远,因为cocosCreator是用cocos2d-js框架并配合可视化的编辑器来实现的。由于是先调研的Unity3D,对这种脚本的方式还是比较能够接受的。其核心思想是在组件,在编辑器中制作精灵和动画,然后通过脚本组件来控制其逻辑实现,各种功能都组件化,当我们需要给精灵添加一个功能的时候,就是向其添加一个组件。在这个小游戏的制作过程中用的组件的数量也是有限的,主要是使用了:
编辑器给我们提供了方便的拖拽界面,直接将我们需要使用的图片导入,就会自动生成精灵文件(但是用过Unity3D之后,还是感觉Unity3D的功能集成度更高一些,而且还可以做3D)。
在编写脚本的时候也是不能脱离编辑器的,在编写脚本的时候着实是让我这个ios程序员有点摸不到头脑了,JS的使用方式有点让我不太适应,没有了xcode的提示功能,写起来还是有些费劲的。JS也是边学边写,不过得益于官方的Demo几乎把所有组件都写了一遍,所以就照着葫芦画瓢。写的时候就发现,其实引擎并没有帮我们做很多的工作(Unity3D可以直接在编辑器里设置物理属性,不过听说下个版本的CocosCreator也会有)。在编写脚本的过程中,最复杂的就是hero脚本的编写,需要检测碰撞和处理hero跳跃过程中的不同状态。碰撞检测的话需要自己计算碰撞发生的位置,当做矩形碰撞器来处理的,只计算x轴和y轴的碰撞。x轴发生碰撞的话,hero有一个和障碍物一样的速度,y轴碰撞一直持续的话就是调整hero的y轴的位置,让其在障碍物的顶部。跳跃的过程中完成动画的切换。
与CocosCreator编辑器不同的是,这个编辑器是我写的一个生成障碍物的一个app,可以方便让产品配置障碍物的位置。主要的实现思路是使用UICollectionView,界面非常的简单,主要是配合CocosCreator脚本的实现,需要将颗粒状的障碍物连成一个长的条状,所以需要将界上的障碍物颗粒结构化一下,取到障碍物的最底部的颗粒的位置,然后连接在一起的高度,这样的话就是对每一列的统一种类的障碍物进行深度优先搜索,记录最低点和搜索过的深度,这样的生成的JSON文件在CoCosCreator脚本里就可以直接使用了。
⑶ 一文详述Cocos Creator物理引擎的基本配置
引言
在Cocos Creator游戏开发的过程中,经常需要做物体的碰撞、反弹等物理判断和检测处理。
一、开启物理引擎
1: 编写脚本来开启物理引擎;
2: 将这个脚本挂载到场景的根节点;
3: 编写调试接口决定是否打开物理引擎调试;
4: cc.director.getPhysicsManager().enabled = true; // 打开物理引擎
1. `cc.director.getPhysicsManager().debugDrawFlags 调试标志;`
2. `varBits= cc.PhysicsManager.DrawBits;`
3. `cc.director.getPhysicsManager().debugDrawFlags = Bits.e_jointBit | Bits.e_shapeBit;`
5: cc.PhysicsManager:
1. `enable: 开启 debugDrawFlags: 调试标志, gravity: 重力加速度,二维向量`
1.书写组件类
1. `const {ccclass, property} = cc._decorator;`
2. `@ccclass`
3. `export default class EnablePhy extends cc.Component {`
4. ` @property({tooltip:"是否开启物理引擎"})`
5. ` enablePhy : boolean = false;`
6. ` @property({tooltip:"是否调试模式"})`
7. ` isDebug : boolean = false;`
8. ` @property({tooltip:"重力加速度"})`
9. `gravity : cc.Vec2 = cc.v2(0, -320);`
11. `private phyManager : cc.PhysicsManager;`
12. ` onLoad () {`
13. ` if(this.enablePhy){`
14. ` this.phyManager = cc.director.getPhysicsManager();`
15. ` this.phyManager.enabled = this.enablePhy;`
16. ` if(this.isDebug){`
17. ` this.phyManager.debugDrawFlags = cc.PhysicsManager.DrawBits.e_shapeBit || cc.PhysicsManager.DrawBits.e_jointBit;`
18. ` }else{`
19. ` this.phyManager.debugDrawFlags = 0;`
20. ` }`
21. ` //console.log("系统默认重力加速度:",this.phyManager.gravity);`
22. ` this.phyManager.gravity = this.gravity;`
23. ` }else{`
24. ` this.phyManager.enabled = false;`
25. ` }`
26. ` }`
27. `}`
2.将组件类挂载到根节点上
二、重力加速度
1: 物理引擎会有一个重力加速度,来模拟物理环境,你可以可以把重力加速度改成0,不受重力影响;
2: 修改重力加速度:
1. `cc.director.getPhysicsManager().gravity = cc.v2(0, -320);`
三、物理刚体cc.RigidBody
1: 刚体:形状不会改变
2: 刚体分为静态,动态刚体, 不受力的刚体(Kinematic,不受作用力的影响);
3: 刚体是受到物理作用的物体,由刚体带着节点移动;
4: 刚体组件cc.RigidBoy:
1. `enabledContactListener: 是否开启碰撞事件的监听;`
2. `bullet: 是否为子弹属性,防止高速穿越;`
3. `allowSleep: 是否允许进入休眠状态,一段时间后如果物体没有任何状态改变会进入休眠状态;`
4. `gravityScale: 该物体收重力的缩放;`
5. `linearDamping: 线性阻尼,衰减线性速度;`
6. `angularDamping: 角速度阻尼,衰减角速度;`
7. `linearVelocity: 刚体的线性速度;`
8. `angularVelocity: 刚体的角速度;`
9. `fixedRotation: 是否固定不旋转;`
10. `awake: 是否立刻唤醒此刚体;`
11. `active: 是否激活这个刚体,如果不激活,那么刚体不会参与碰撞;`
四、刚体碰撞器cc.Collider
1: 光有刚体还不够,还要为每个刚体添加一个物理性状;
2: 物理形状的类型:
1. `矩形物理碰撞器;`
2. `圆形物理碰撞器;`
3. `多边形物理碰撞器;`
4. `链条碰撞器: PhysicsChainCollider;`
3: 碰撞器的物理参数:
1. `Tag: 碰撞器的标记,区别一个节点上多个不同的碰撞器;`
2. `Density: 形状的密度;`
3. `Sensor: 是否为一个碰撞感应器;`
4. `Friction: 摩擦系数;`
5. `Restitution: 弹性系数[0, 1], 0没有弹性, 1完全弹性碰撞;`
6. `Editing: 可以编辑碰撞器的形状;`
4: 一定要加物理碰撞器,而不是碰撞系统的碰撞器,非常容易出错误
更多cocos教学视频:
Cocoswww.bycwe.com/promotion_channels/2146264125?cate=710180854
⑷ cocosCreator 怎么使用物理引擎
Size VisibleRect = Director::getInstance()->getVisibleSize(); Camera *camera = CCCamera::createOrthographic(VisibleRect.width, VisibleRect.height, 0, 1); camera->setCameraFlag(CameraFlag::USER2); camera->setPosition(Vec2(x,y));。
⑸ CocosCreator教程(入门篇)
自动释放资源: 切换场景后,上一个场景中的资源,从内存中释放。
延迟加载资源: 意味着不用等待所有资源加载完毕,才显示场景。(快速切换场景,资源陆续在画面显示)
普通图,子层为一张spriteFrame。
创建方式:拖拽场景节点,到资源管理器。
精灵图,子层为多张spriteFrame。(精灵图合成软件:TexturePacker、Zwoptex)
打包时,将所在目录中的所有碎图,合成为图集。
数字为内容的图集。
动态字体:.ttf
位图字体:.fnt + .png(存在于同一目录)
小型动画
模式: web audio、dom audio
操作流程:
(1)导出:文件 => 资源导出,选择 .fire场景文件,输出assets目录的 .zip压缩包。
(2)导入:文件 => 资源导入,选择压缩包源路径、解压路径,输出assets目录内容。
基于size mode,尽量去除spriteFrame无像素的部分,减小图片尺寸。
作用: 用于变换、子节点定位基准。
对摄像机、渲染组件的了解。
对widget、layout等UI组件的了解。
(1)创建动画的基本流程
(2)时间曲线(双击动画线,进入编辑窗口)
(3)事件管理(双击游标、加减按钮控制参数个数)
(4)脚本控制
碰撞组件(普通碰撞)
(1)editing——是否为编辑模式
(2)regenerate points——计算图形边界,自定生成控制点,数值为控制点的生成密度 / 准确度
(3)ctrl + 点击——删除控制点
(4)组件类型:矩形、圆形、多边形
(5)设置碰撞组(项目 => 项目设置 => 分组设置):
制定分组 => 匹配分组 => 碰撞组件所在节点上,设置所属分组
(6)脚本控制
Box2D物理引擎(高级碰撞)
(1)audioSource组件
(2)脚本控制
(1)定义 CCClass
(2)实例化
(3)判断类型
(4)构造函数(ctor)
(5)实例方法
(6)继承(extends)
(7)父构造函数
(8)完整声明属性
properties常用参数
(1)获得组件所在的节点
(2)获得其它组件
(3)获得其它节点及其组件
(4)访问已有变量里的值(通过模块访问)
(1)节点状态和层级操作
(2)更改节点的变换(位置、旋转、缩放、尺寸)
(3)颜色和不透明度
(4)常用组件接口
cc.Component 是所有组件的基类,任何组件都包括如下的常见接口:
(1)创建新节点
(2)克隆已有节点
(3)创建预制节点
(4)销毁节点
(1)加载和切换
(2)通过常驻节点,进行场景资源管理和参数传递
(3)场景加载回调
(4)预加载场景
(1)资源属性的声明
(2)静态加载(在属性检查器里设置资源)
(3)动态加载
(4)加载远程资源和设备资源
(5)资源的依赖和释放
(1)监听事件
(2)关闭监听
(3)发射事件
(4)派送事件
(5)事件对象(回调参数的event对象)
(1)鼠标事件类型和事件对象
(2)触摸事件类型和事件对象
(3)其它事件
(1)动作控制
(2)容器动作
(3)即时动作
(4)时间间隔动作
(5)动作回调
(6)缓动动作
(1)XMLHttpRequest——短连接
(2)WebSocket——长连接
对象池的概念
在同一场景中,需要多次进行节点的生成、消失时,假如直接进行创建、销毁的操作,就会很浪费性能。因此,使用对象池,存储需要消失的节点,释放需要生成的节点,达到节点回收利用的目的。
工作流程
(1)初始化对象池
(2)从对象池请求对象
(3)将对象返回对象池
清除对象池