SetUserData和对象比较混乱

时间:2014-04-18 18:11:54

标签: c# box2d collision-detection sfml

我正在尝试让SFML.NET与Box2DX一起使用。

我正在制作一个简单的乒乓球游戏,只需要使用Box2DX中的碰撞检测和碰撞回调

我已经用自己的方法覆盖了ContactListener,它运行正常。问题是当我使用body.SetUserData()并从SFML.NET传入Sprite对象时,我不知道如何比较哪些Sprite会发生碰撞。

这就是我现在所拥有的,它无效:

class MyContactListener : ContactListener
{
    public override void Add(ContactPoint point)
    {
        Sprite spriteA = (Sprite)point.Shape1.GetBody().GetUserData();
        Sprite spriteB = (Sprite)point.Shape2.GetBody().GetUserData();

        if (spriteA == spriteB || spriteB == spriteA)
            Console.WriteLine("Same sprites colliding.");
        else
            Console.WriteLine("Different sprites colliding.");

    }
    public override void Persist(ContactPoint point) { }
    public override void Remove(ContactPoint point) { }
    public override void Result(ContactResult point) { }
}

当添加联系人时,即使精灵相同,也会始终打印“不同的精灵碰撞”。

我想传入Sprite对象,因为我需要使用sprite来绘制     body.GetUserData();

1 个答案:

答案 0 :(得分:0)

我添加了一个超类Entity,我继承了Ball,Enemy和Player类。 现在可以比较课程。

我不再将Sprite作为UserData传递。我传入了超类Entity。 我通过Draw()方法中的类实例访问sprite。

在类播放器:实体

this.playerBody.SetUserData(this);

在课堂上MyContactListener:

class MyContactListener : ContactListener
{
    public override void Add(ContactPoint point)
    {
        Body bodyA = point.Shape1.GetBody();
        Body bodyB = point.Shape2.GetBody();

        Entity typeA = (Entity)bodyA.GetUserData();
        Entity typeB = (Entity)bodyB.GetUserData();

        // Ball collision with Enemy
        if ((typeA is Enemy && typeB is Ball) || (typeB is Ball && typeA is Enemy))
        {
            // Do something based on the collision
        }