我正在制作一个游戏,其中多个角色互相射击并且在击中火焰时他们将使用不同的动画,例如:爆炸,弹跳,模糊等等。现在,我被卡住的事情是,当火正在旅行时,我们如何检查它与其他物体相交?我的意思是仅在目标角色上运行动画。
答案 0 :(得分:0)
您可以保存想要检查向量的对象,并在场景中安排检查是否发生碰撞的更新。
答案 1 :(得分:0)
这是 Box2D 的答案。
为您要触发的每个对象创建一个body def。使用下面的一些代码。确保更改形状以适合您的需要。我的代码中的像素与仪表比率设置为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)
在您希望子弹前进的位置对身体施加速度。
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());
}
我希望这会有所帮助。这就是我用来实现您正在寻找的功能。