问题描述
我最近在一个项目中,我们的团队使用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 (将#修改为@)