如何在Monogame中使用Aether.Physics2D检测接触?

问题描述

我最近在一个项目中,我们的团队使用Monogame来开发一款小型游戏,目前我正在努力进行碰撞检测。

基本上,我们的角色需要发射出波形形式的粒子,我希望看到粒子撞到障碍物时消失。因此,我想通过将问题缩小到两个游戏对象“ Particle”和“ Platform”(这是我们的C#类的名称)之间的冲突来测试该功能

因此,我在stackexchange上研究了该线程,因为我听说Aether.Physics2D与Farseer引擎有关: https://gamedev.stackexchange.com/questions/24029/farseer-physics-collision-detection-vs-intersection-detection-with-sensors

首先,在“粒子”的构造函数中,将“粒子类”的物理主体设置为传感器。像这样:

    public Particle(string PATH,Vector2 Speed,Vector2 Position,int color,World world) {
            // ... more code but irrelevant

            this._particleBody = world.CreateRectangle(Rect.X,Rect.Y,1f,new tainicom.Aether.Physics2D.Common.Vector2(Position.X,Position.Y));
            this._particleBody.BodyType = BodyType.Dynamic;

            // set the body as a sensor
            this._particleBody.SetIsSensor(true)
    }

然后在我的主game.cs文件中,创建了平台对象并将其存储到静态列表中,以便可以访问“粒子类”中的列表(当前列表中只有一个Platform对象)

    static public List<Platform> platforms;
    public Platform platform1;

    // ... 

        protected override void Initialize()
        {

            base.Initialize();

            // ...

            
            
            /* Platforms */
            tainicom.Aether.Physics2D.Common.Vector2 platRect1 = new tainicom.Aether.Physics2D.Common.Vector2(15f,1f); // 15 x 1
            tainicom.Aether.Physics2D.Common.Vector2 platPos1 = new tainicom.Aether.Physics2D.Common.Vector2(0,-(platRect1.Y / 2f));
            platform1 = new Platform(platPos1,platRect1,_world);

            // push that platform to the platform list (for collision events)
            platforms.Add(platform1);

        }

设置好所需的东西之后,在“粒子类”的Update方法中,然后通过访问“接触列表”并提取接触体来开始处理碰撞:

    public void Update() {


            foreach (Contact contact in _world.ContactList)
            {
                foreach (Platform platform in Game1.platforms)
                if ((contact.FixtureA.Body == _particleBody && contact.FixtureB.Body == platform._platformBody) ||
                    (contact.FixtureB.Body == _particleBody && contact.FixtureA.Body == platform._platformBody))
                {
                    // destroy that one particle 
                    // (I didn't do it here,there's another class that handles the action of these particles,I simply set a flag. )
                    // (e.g. tobedestroyed = true)
                }
            }   
        }

最后,粒子确实被破坏了,但是在一个非常奇怪的行为中,视频中的白色斑点是“粒子”的一个实例,绿色条纹平台是“平台”的一个实例,我希望看到撞到平台后,白点消失了。

这是在我添加碰撞处理代码之前: https://drive.google.com/file/d/1kUMqna0rk0Z7hs3-999dQcJT8vRmWlrs/view?usp=sharing

添加代码后,粒子(视频中的小白点)会出现一秒钟,然后消失,甚至在撞上平台之前,即使我将粒子放在较高的位置,它也会在消失后消失一秒钟,甚至没有撞到任何物理物体。 不得不手工记录下来,因为它消失得太快了: https://drive.google.com/file/d/1R0YORFtCnxirGLQcJvcazGKKIwu5vwUB/view?usp=sharing

我一直在寻找有关Farseer或Aether的资源,但似乎很少,如果有人获得有用的文章链接,请告诉我。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)