Android的跑酷游戏的设计+源代码(5)
时间:2022-04-08 23:21 来源:毕业论文 作者:毕业论文 点击:次
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,表示所有的身体会相互碰撞,但默认不发送接触事件。 (责任编辑:qin) |