PhysicsWorld有很多工厂方法,如createEdgeBox创建一个矩形的边框,所有的参数是:
矩形区域,设置作为visibleSize。
可选参数,纹理,默认为PHYSICSBODY_MATERIAL_DEFAULT。
可选参数,边框大小,默认为1。
然后,创建节点,并连接刚刚创建的节点的身体。屏幕为节点的位置设置好的中心,最后加入节点到场景。在Cocos2d-x 3。0节点的addChild方法可以处理物理刚体。它会自动添加节点的身体到场景的PhysicsWorld。PhysicsBody的工程方法可以根据参数设置刚体的大小,创建相应的PhysicsBody和PhysicsShape。这是一个常见的做法由物理引擎直接创建一个刚体。然而,在Cocos2d-x 3。0物理集成简化了这个过程,所以并不需要编写大量的代码。
下面的代码将告诉如何创建在屏幕上一个物理边界:
Size visibleSize = Director::getInstance()->getVisibleSize();
auto body = PhysicsBody::createEdgeBox(visibleSize,
PHYSICSBODY_MATERIAL_DEFAULT, 3);
auto edgeNode = Node::create();
edgeNode->setPosition(Point(visibleSize。width / 2, visibleSize。height / 2));
edgeNode->setPhysicsBody(body);
scene->addChild(edgeNode);
3、创建受重力影响的精灵
首先创建一个sprite,然后用PhysicsBody::createCircle创建一个圆形的body附加在sprite上。 整个过程和之前创建边界的过程是一致的。可以创建PhysicsShape并将它们通过addShape()添加到刚体,但要注意,质量mess(由密度和面积计算)和瞬间形状会自动添加到刚体,而在添加到刚体body后无法改变形状的相对位置和旋转。如果不需要它了,可以使用removeShape()删除它。下面的代码是创建一个受重力作用的精灵:论文网
void HelloWorld::addNewSpriteAtPosition(Point p)
{ auto sprite = Sprite::create("circle.png");
sprite->setTag(1);
auto body = PhysicsBody::createCircle(sprite->getContentSize()。width / 2);
sprite->setPhysicsBody(body);
sprite->setPosition(p);
this->addChild(sprite);
}
4、碰撞检测
Cocos2d-x中,重构了事件派发机制,所有的事件都由派发器统一去管理。同样物理引擎的碰撞也是这样,下面的代码注册碰撞begin回调函数:
auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);
除了以上方法,同样可以使用以下三个事件来监听想要监听的bodys,shape或group事件:
1、EventListenerPhysicsContactWithBodies
2、EventListenerPhysicsContactWithShapes
3、EventListenerPhysicsContactWithGroup
同时还需要设置物理接触相关的位掩码值,因为接触事件在默认状态下是不会被接受的,即使创建相对的EventListener事件。设置接触相对位掩码的方法和设置Box2D的方法是一样。位掩码有三个值:CategoryBitmask,ContactTestBitmask和CollisionBitmask。可以使用相应的get或set方法来获取或设置它们的值。位掩码值的逻辑和操作测试有如下标准:
1、比如一个body的CategoryBitmask位掩码并与另一body的ContactTestBitmask位掩码其结果不等于零时,接触事件将被发出,相反接触的事件将不被发送。
2、比如一个的body的CategoryBitmask位掩码并与另一body的CollisionBitmask位掩码其结果不等于零,则它们碰撞,相反则不会发生碰撞事件。
比如在默认情况下,CategoryBitmask值为0xFFFFFFFF,ContactTestBitmask值是00000000,而CollisionBitmask值为0xFFFFFFFF,表示所有的身体会相互碰撞,但默认不发送接触事件。