cocos2d-x 3.x 物理碰撞机制
近期又弄了物理引擎。写一下吧,以下有在其它博客学习到的知识。加上自己的理解,总结下。
cocos2d-x 3.X 中全新的封装的物理引擎给了开发人员最大的便捷,你不用再繁琐与各种物理引擎的细节,全然的封装让开发人员能够更快更好的将物理引擎的机制加入到自己的游戏中,简化的设计是从2.0到3.X的一个质的飞跃。
cocos2d-x 3.0+中的物理属性:
1、物理世界被集成到场景中。当你创建一个场景。你能够直接创建基于物理世界或者不使用物理世界的场景。
2、Node拥有它自己的body属性。
(sprite也是node)‘
3、cocos2d-x 3.0 已经封装了物理属性Body(PhysicsBody),Shape(PhysicsShape),Contact(PhysicsContact),Joint(PhysicsJoint)和World(PhysicsWorld),更加方便使用。
4、方便的使用listener-EventListenerPhysicsContact进行碰撞检測。
当然,封装好的物理引擎能够简化开发难度,假设有能力的话也能够直接使用Box2D和Chipmunk的原生的物理引擎进行开发,这样难度会有所提升。
以下的代码创建一个带物理世界的场景,并传递到场景中的层上。
PhysicsLayer.h中
- class PhysicsLayer : public cocos2d::Layer
- {
- ...
- // add following codes设置层中的物理世界
- void setPhyWorld(PhysicsWorld* world){m_world = world;}
- private:
- PhysicsWorld* m_world;
- ...
- }
PhysicsLayer.cpp中的createScene()方法中加入以下代码:
- Scene* PhysicsLayer::createScene()
- {
- ...
- // add following codes
- auto scene = Scene::createWithPhysics();
- scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);//调试
- auto layer = HelloWorld::create();
- layer->setPhyWorld(scene->getPhysicsWorld());//将创建的物理世界传递到子层中
- scene->addChild(layer);
- return scene;
- }
Scene类有一个新的static工厂方法createWithPhysics()创建一个带物理世界的场景。能够通过getPhysicsWorld()来获取PhysicsWorld的实例。
上述代码中凝视为调试的代码在调试中很实用,它会显示游戏中物体所带有的物理边界,便于观察碰撞中的细节等。
同一时候一个场景中仅仅能有一个物理世界,全部属于这个场景的子层都共享这一个物理世界。所以在子层中用到物理世界时都会有这个定义的函数
- void setPhyWorld(PhysicsWorld* world){m_world = world;}
进而来设置子层中的物理世界。
PhysicsWorld拥有默认的重力设置,Vector(0.0f,-98.0f),当然你也能够任意设置你想要的重力加速度。setGravity(Vect(0.0f,-200.0f)),设置重力加速度为20米每二次方秒。
创建物理边界
- Size visibleSize = Director::getInstance()->getVisibleSize();
- auto body = PhysicsBody::createEdgeBox(visibleSize, PHYSICSBODY_MATERIAL_DEFAULT, 3);//设要加入到节点中的物理body
,这个Box是不受碰撞检測的!!! - auto edgeNode = Node::create();
- edgeNode->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
- edgeNode->setPhysicsBody(body);//将物理body增加到创建的节点中
- scene->addChild(edgeNode);场景中加入创建的物理节点
PhysicsWorld有非常多工厂方法。如createEdgeBox创建一个矩形的边框,參数:
创建受重力影响的精灵
- void HelloWorld::addNewSpriteAtPosition(Point p)
- {
- auto sprite = Sprite::create("circle.png");//创建精灵
- sprite->setTag(1);//设置精灵的便签值
- auto body = PhysicsBody::createCircle(sprite->getContentSize().width / 2);//创建一个附加在精灵身体上的圆形物理body
- sprite->setPhysicsBody(body);//将创建的body加到精灵身上
- sprite->setPosition(p);
- this->addChild(sprite);//加入精灵
- }
以下讲一下真正的重点所在——物理碰撞检測
- auto contactListener = EventListenerPhysicsContact::create();
- contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin, this);
- _eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);
每一次碰撞检測事件是有EventListenerPhysicsContact来进行监听的。监听到碰撞事件时,会回调响应事件onContactBegin()来进行碰撞事件的处理。_eventDispatcher是事件派发器,由它管理全部的注冊事件。
- CategoryBitmask = 0xFFFFFFFF;
- ContactTestBitmask = 0x00000000;
- CategoryBitmask & ContactTestBitmask = 0,所以不会发送碰撞信号
- CollisionBitmask = 0xFFFFFFFF;
- CategoryBitmask & CollisionBitmask = 0xFFFFFFFF
- 所以物体会碰撞,可是不会响应碰撞回调函数。
同一时候能够使用PhysicsContact::setData()来设置接触操作的用户数据。
当返回false时。onContactPreSolve和onContactPostSolve将不会被调用,可是onContactSeperate将被调用一次。
2、onContactPreSlove ,会在每一次被调用。通过放回true或者false来决定两个物体是否有碰撞,相同能够用ignore()来跳过兴许的onContactPreSolve和onContactPostSolve回调函数。(默认返回true)
cocos2d-x 3.x 物理碰撞机制的更多相关文章
- Cocos2D物理碰撞不按预期工作的排查工作
如果该碰撞的节点不碰撞或反过来不该碰的碰撞了,你可以检查一下几个方面: 1.对应2个节点的分类和掩码必须匹配.如果它们应该碰撞则一个节点的分类应该在另一个节点的掩码中,反之亦然. 2.注意空的分类和掩 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- 【Unity探究】物理碰撞实验
这几天为了准备面试,所以决定对平时学习中的盲点扫盲一下,首先想到的就是物理碰撞.以前没有好好研究过,一直模糊不清,到底什么条件下才可以产生物理碰撞呢?只要其中一个有Rigidbody就可以了吗?所以进 ...
- iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计
本节主要讲解如何创建无限循环Endless的星空背景(如下图).玩家飞船发射子弹,监测子弹击外星敌机的SpriteKit物理碰撞并消灭敌机,以及应用iOS的CoreMotion加速计移动飞船躲避外星敌 ...
- 【Unity】物理碰撞实验
http://www.cnblogs.com/javawebsoa/archive/2013/05/18/3085818.html 这几天为了准备面试,所以决定对平时学习中的盲点扫盲一下,首先想到的就 ...
- Unity射击游戏实例—物理碰撞的实现
前言: 这一篇章实现物理碰撞,就是游戏体碰撞减装甲,这几天想要试着做出兼具装甲与血量的模式,可自动回复的装甲与永久损伤的血量,在一些平台上找到了不少有意思的模型,有兴趣的可以自己找找模型替换一下. 射 ...
- Cocos2d-x 3.0中 物理碰撞检測中onContactBegin回调函数不响应问题
好吧,事实上这篇也是暂时冒出来的,近期朋友要做个物理游戏,曾经做物理还是用box2d,呃.确实要花些功夫才干搞懂当中的精髓,可是听讲这套引擎又一次封装了一次.要easy非常多,所以就简单尝试了一下,感 ...
- U3D物理碰撞总结
OnCollisionEnter的触发条件: 1.都有boxcollider组件并且IsTrigger为false 2.主动碰撞的物体要有非运动学刚体组件,被动碰撞的物体有木有都行 3.如果主动碰撞的 ...
- [UE4]碰撞机制
应用于两种情况: 一.射线追踪,LineTrace 1.射线来自某个Trace Channel 2.Trace Channel 默认有两个:Visibility(不是可见的意思.只是Channel名称 ...
随机推荐
- Angular中父子组件双向绑定传值
下面为大家展示一个较为简单的ng父子组件双向绑定传值,下面是父组件页面 这个页面的大概功能就是父组件(红色)通过输入框输入内容反映到子组件上进行展示,并且进行了投影, 子组件(橙黄色)通过Input输 ...
- axios中的qs
qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装. 1. qs.parse()将URL解析成对象的形式 const Qs = require('qs'); let url ...
- MySQL:入门
一.前言 MySQL :是用于管理数据的软件 MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性. 分为服务端和客户 ...
- python中参数传递的方法
Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递,不定参数传递(包裹传递)和解包裹传递. 1.位置传递实例: def fun(a,b,c) return a+b+ ...
- SDOI2017 树点涂色——LCT the END
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- 原型链中的prototype、__proto__和constructor的关系
先来看一张图,这张图可以说是围绕以下代码完整的描述了各对象之间的关系.接下来我们来看看如何一步步画出这张图. function Foo(){}; var foo = new Foo(); 首先,明确几 ...
- Android之NDK环境配置+JNI开发+so文件编译
前言 这边Android作为日常记录,虽然破坏了文章队形~ 最近人工智能挺火的,也稍微了解了一些库,比如关于视觉库openCV.要在安卓下调用这些C/C++库,需要用到JNI开发,在此把过程分享一 ...
- 四元数(Quaternion)和旋转 +欧拉角
四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转. ...
- TF-IDF与余弦相似性的应用:找出相似文章
"找出相似文章"的一种算法: 利用TF-IDF算法,找出两篇文章的关键词. 每篇文章若干个关键词的相对词频. 生成两篇文章各自的词频向量. 计算两个向量的余弦相似度,值越大就表示越 ...
- 三年Linux运维工作总结教训
Linux运维一定要知道的六类好习惯和23个教训,避免入坑! 从事运维三年半,遇到过各式各样的问题,数据丢失,网站挂马,误删数据库文件,黑客攻击等各类问题. 今天简单整理一下,分享给各位小伙伴. 一. ...
