cocos2d-x 3.2 物理碰撞机制
|
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
auto edgeNode = Node::create();
edgeNode->setPosition(Point(visibleSize.width/
2
,visibleSize.height/
));
edgeNode->setPhysicsBody(body);
//将物理body加入到创建的节点中
scene->addChild(edgeNode);场景中添加创建的物理节点
|
创建受重力影响的精灵
下面的代码创建一个受重力影响的精灵,3.0中的创建精灵代码也大大简化 HelloWorld::addNewSpriteAtPosition(Point p)
auto sprite = Sprite::create(
"circle.png"
//创建精灵
sprite->setTag(
1
//设置精灵的便签值
auto body = PhysicsBody::createCircle(sprite->getContentSize().width /
//创建一个附加在精灵身体上的圆形物理body
sprite->setPhysicsBody(body);
//将创建的body加到精灵身上
sprite->setPosition(p);
this
->addChild(sprite);
//添加精灵
}
|
下面讲一下真正的重点所在——物理碰撞检测
谈到物理碰撞检测,真是感慨良多,在第一次运用碰撞检测时,遇到各种问题,最大的问题就是注册完物理碰撞响应时间,写好碰撞响应函数后,居然没反应,找各种 论坛贴,各种google,最后都没有解决问题,最后还是在官网找到的解决方法,下面先介绍下如何设置碰撞检测。 前面的博客讲过了3.0中的事件分发机制,所以物理引擎的碰撞事件也不例外,统一的都有事件派发器来管理。 下面代码注册碰撞响应事件和回调函数auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin,
);
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener,monospace!important; font-size:1em!important; min-height:inherit!important; background:none!important">);
|
一个body的CategoryBitmask和另一个body的ContactTestBitmask的逻辑与的结果不等于0时,接触事件将被发出,否则不发送。
一个body的CategoryBitmask和另一个body的CollisionBitmask的逻辑与结果不等于0时,他们将碰撞,否则不碰撞
默认情况下的body属性会进行物理碰撞,但不会发送碰撞检测的信号,也就不会响应碰撞回调函数,这个可以看下默认情况下的掩码值的逻辑与
0xFFFFFFFF
;
ContactTestBitmask =
0x00000000
;
CategoryBitmask & ContactTestBitmask =
0
CollisionBitmask =
;
CategoryBitmask & CollisionBitmask =
0xFFFFFFFF
所以物体会碰撞,但是不会响应碰撞回调函数。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!