【问题标题】:SetUserData and object comparing confusionSetUserData 和对象比较混淆
【发布时间】:2014-06-03 07:02:24
【问题描述】:

我正在尝试让 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 对象,因为我需要使用 body.GetUserData();

【问题讨论】:

    标签: c# box2d collision-detection sfml


    【解决方案1】:

    我添加了一个超类实体,我继承了我的 Ball、Enemy 和 Player 类。 现在可以比较类。

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

    在类 Player : Entity

    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
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 2019-12-29
      • 2016-03-19
      • 1970-01-01
      相关资源
      最近更新 更多