Android的跑酷游戏的设计+源代码(5)_毕业论文

毕业论文移动版

毕业论文 > 计算机论文 >

Android的跑酷游戏的设计+源代码(5)

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)