cocos2dx 3.x 物理引擎学习笔记
来源:互联网 发布:shopnc app源码 编辑:程序博客网 时间:2024/06/03 02:36
cocos2dx从3.0开始自己封装了物理引擎,当然是基于chipmunk。相对box2d来讲,chipmunk更轻量。
下面直接上一些运用的规则:
1. 建立物理世界
Scene*HelloWorld::createScene()
{
auto scene =Scene::createWithPhysics();
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
auto layer =HelloWorld::create();
scene->addChild(layer);
return scene;
}
与普通的Scene创建方式不同的是,物理世界调用了Scene的createWithPhysics()方法,其他一样。
为了调试方便,可以给物理世界的刚体开启红边,这样就能直观的看出刚体了。
2.建立边界
Size visibleSize =Director::getInstance()->getVisibleSize();
auto body =PhysicsBody::createEdgeBox( visibleSize,PHYSICSBODY_MATERIAL_DEFAULT,3);
auto edgeShape =Node::create();
edgeShape->setPhysicsBody( body);
edgeShape->setPosition( visibleSize.width /2, visibleSize.height /2);
addChild( edgeShape);
一般在Scene的init方法里创建物理世界的边界,方法是先调用PhysicsBody::createEdgeBox()创建一个边界刚体,然后再创建一个空的Node,将两个绑定在一起放在Scene中。
这个逻辑我觉得很奇怪,为什么不在第一步创造物理世界的时候指定边界尼?
3.接下来就是创造你需要的刚体了。
一般都是创建好刚体,然后和精灵绑定。为了更符合精灵的形状以便于做碰撞检测,我们可以使用一些物理编辑器。
auto sprite =Sprite::create("sprite.png");
auto box =PhysicsBody::createBox( sprite->getContentSize());
sprite->setPhysicsBody(box);
addChild(sprite);
这一段绑定刚体的代码还是很符合正常人逻辑的。我们也可以设置好多刚体的属性,例如重力等。
4.刚体的三个掩码,都是32位:
categoryBitmask: 定义了分类,只要and操作后非0就可以触发碰撞,默认全打开
contactTestBitmask:定义了是否触发回调函数,默认关掉
collisionBitmask:定义了发生碰撞后是否继续作用物理效果,如果不作用就会穿过去,作用就会摊开,默认全打开
这三个掩码用来定义刚体,方便做碰撞检测。比如说,你肯定不希望英雄和自己发出的子弹做出碰撞检测吧,那就用这三个掩码来定义你的英雄和子弹。
我在实测的时候发现没定义的情况下有问题:只给一个刚体定义了contactTestBitmask,其他没变。按道理来讲,这个时候两个刚体是能碰撞但是不会触发回调的。因为categoryBitmask全打开会碰撞,而一个contactTestBitmask是关掉的,也就是说这个关掉的contactTestBitmask和另一个定义的contactTestBitmask进行and操作后肯定还是0,所以不会触发回调。但是实际情况却是触发回调了。所以使用的时候建议定义下三个掩码。
auto contactListener=EventListenerPhysicsContact::create();
contactListener->onContactBegin =CC_CALLBACK_1(HelloWorld::callback,this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener,this);
boolHelloWorld::callback(constPhysicsContact& contact)
{
log("%d == a", contact.getShapeA()->getBody()->getContactTestBitmask());
log("%d == b", contact.getShapeB()->getBody()->getContactTestBitmask());
return true;
}
- cocos2dx 3.x 物理引擎学习笔记
- cocos2dx-3.x物理引擎Box2D介绍
- cocos2dx-3.x 修改默认物理引擎为Box2D
- Cocos2dx 学习笔记 -TMX和物理引擎的结合
- cocos2d-x初探学习笔记--物理引擎box2d(2)
- cocos2d-x初探学习笔记--物理引擎box2d(1)
- Cocos2d-x学习笔记(十五)-------->物理引擎
- cocos2dx - Chipmunk 物理引擎 -个人笔记
- Cocos2d-x 3.x学习笔记:猩先生带你打飞机(三)物理引擎的使用
- cocos2dx 3.x 物理引擎接触检测掩码、碰撞掩码和类别掩码问题解析
- cocos2dx 3.x物理引擎对于setCollisionBitmask、setCategoryBitmask、setContactTestBitmask的理解
- 物理引擎Chipmunk2d学习笔记
- [cocos2dx]cocos2dx3.x+lua中使用物理引擎
- Ubuntu Cocos2dx 学习笔记——添加Box2d物理游戏引擎
- 【学习2】Cocos2d-x 3.x中使用物理引擎创建物理元素
- cocos2dx 物理引擎
- cocos2dx之物理引擎
- cocos2d-x 物理引擎BOX2d学习
- 音字转换实验、HMM+viterbi
- java 中String编码和byte 解码 总结
- Android 动画效果 --Animation 总汇一
- 黑马程序员_Java语言基础组成
- 【笔记】Java编程思想—一异常处理
- cocos2dx 3.x 物理引擎学习笔记
- python 常见bug以及处理方式
- 黑马程序员_JAVA基础_继承,抽象和接口
- 四舍五入取整小议 - c#
- 折腾的网上团购支付
- Problem E: 编写函数:递归求逆序 (Append Code)
- 黑马程序员_JAVA基础_多态-Object类
- json-c例子
- 谨记第一次写blog