【发布时间】:2015-11-23 06:52:09
【问题描述】:
我正在制作一个游戏,其中多个角色相互射击,并且在击中火焰时,他们会以不同的动画进行动作,例如:爆炸、反弹、模糊等等。现在我被卡住的事情是,当火在传播时,我们将如何检查它是否与其他物体相交?我的意思是只在目标角色上运行动画。
【问题讨论】:
标签: cocos2d-x box2d collision chipmunk
我正在制作一个游戏,其中多个角色相互射击,并且在击中火焰时,他们会以不同的动画进行动作,例如:爆炸、反弹、模糊等等。现在我被卡住的事情是,当火在传播时,我们将如何检查它是否与其他物体相交?我的意思是只在目标角色上运行动画。
【问题讨论】:
标签: cocos2d-x box2d collision chipmunk
您可以保存要检入向量的对象,并在场景中安排更新以检查它们是否发生碰撞。
【讨论】:
这是 Box2D 的答案。
为您要触发的每个对象创建一个主体定义。使用下面的一些代码。确保更改形状以适合您的需要。我在代码中将像素与米的比例设置为 32.0。
b2BodyDef bulletDef;
bulletDef.type = b2_dynamicBody;
bulletDef.position.Set(startPositionX / Pixel_To_Meter_Ratio,
startPositionY / Pixel_To_Meter_Ratio);
auto b2PolygonShape bulletShape;
bulletShape.SetAsBox(bulletWidth / Pixel_To_Meter_Ratio,
bulletHeight / Pixel_To_Meter_Ratio);
auto bulletBody = physicsWorld->CreateBody(bulletDef)
在您希望子弹移动的位置将速度应用于身体 def。
bulletBody->ApplyLinearImpulse(b2Vec(bulletDirectionX,
bulletDirectionY),
physicsBody->GetPosition(),
true);
向继承自 b2ContactListener 的物理世界添加一个联系人监听器
// Node that manages the physics world from box2d
class PhysicsNode : public b2ContactListener
{
void BeginContact(b2Contact* contact);
}
// register this listener with the box2d world
auto physicsWorld = new b2World(b2Vec2(0, -9.8f));
physicsWorld ->SetContactListener(this);
实现 BeginContact 函数并在其中处理碰撞。
void PhysicsNode::BeginContact(b2Contact* contact)
{
// Get the physics bodies
auto objectOne = contact->GetFixtureA()->GetBody();
auto objectTwo = contact->GetFixtureB()->GetBody();
// Cast to the type you set as your user data
auto collidableOne = static_cast<Collidable*>(objectOne->GetUserData());
auto collidableTwo = static_cast<Collidable*>(objectTwo->GetUserData());
// Handle your collisions. Apply blur/explode/whatever you need
collidableOne->handleCollision(collidableTwo->isReactableCollision());
collidableTwo->handleCollision(collidableOne->isReactableCollision());
}
我希望这会有所帮助。这就是我用来实现您正在寻找的功能的东西。
【讨论】: