双分派模式——不同形状碰撞

131 阅读1分钟

物体放在一个vector中,只有指向基类的指针,任意两个物体A,B碰撞,先找出A,B真实指向的物体类型,利用多态,this指针,然后碰撞检测。

vector<Collider> cs;
Collider *colliderA; //Cube
Collider *colliderB; //Sphere
class Collider
{
    virtual void ColliderDispatch(Collider *b, PositionBasedDynamics &pbd) = 0;
    virtual void ColliderDispatch(ParticleCollider *B, PositionBasedDynamics &pbd) = 0;
    virtual void ColliderDispatch(CubeCollider *B, PositionBasedDynamics &pbd) = 0;
};
class SphereCollider : public Collider
{
        void ColliderDispatch(Collider *b, PositionBasedDynamics &pbd)
        {
            b->ColliderDispatch(this, pbd);
        }

        void ColliderDispatch(ParticleCollider *B, PositionBasedDynamics &pbd) override;

        void ColliderDispatch(CubeCollider *B, PositionBasedDynamics &pbd) override;
};
class CubeCollider : public Collider
{
        void ColliderDispatch(Collider *b, PositionBasedDynamics &pbd)
        {
            b->ColliderDispatch(this, pbd);
        }

        void ColliderDispatch(ParticleCollider *B, PositionBasedDynamics &pbd) override;

        void ColliderDispatch(CubeCollider *B, PositionBasedDynamics &pbd) override;
};

第一次,找出A的真实物体类型

colliderA->ColliderDispatch(colliderB);

colliderA 成员函数,this指针真实子类CubeCollider

void ColliderDispatch(Collider *b)
{
    b->ColliderDispatch(this);
}

第二次,找出B的真实物体类型 colliderB 成员函数

void ColliderDispatch(CubeCollider *b)
{
    SphereCubeIntersect(...);
}