穿过其他实体的投射物

本文关键字:投射物 实体 其他 | 更新日期: 2023-09-27 17:58:03

我为正在开发的游戏编写了一个碰撞检测系统,我遇到了一个奇怪的故障,偶尔会有炮弹穿过玩家或散落在整个关卡的墙壁。因为投射物可以以任何角度发射,我将每个投射物的边界框分解为多个较小的边界框,然后根据投射物在空间中的旋转,围绕纹理中心旋转。出于某种原因,偶尔会有长矛投射物穿过玩家或墙壁,即使其他人没有穿过。

我使用以下方法来确定纹理的旋转并平移边界框:

        public double RotateToFaceTarget()
    {
        double rotation = Math.Atan2((double)_direction.Y, (double)_direction.X);
        return rotation;
    }
    public List<BoundingBox> TranslateBoundingBox(List<BoundingBox> box, double rotation)
    {
        List<BoundingBox> newBounds = new List<BoundingBox>();
        foreach (BoundingBox b in box)
        {
            Vector2 boundsOrigin = new Vector2(b.Pos.X + b.Size.X / 2, b.Pos.Y + b.Size.Y / 2);
            Vector2 texOrigin = new Vector2(_pos.X + _texture.Width / 2, _pos.Y + _texture.Height / 2);
            Vector2 newPosBasedOnOrigin = Vector2.Transform(boundsOrigin - texOrigin, Matrix.CreateRotationZ((float)rotation)) + boundsOrigin;
            newBounds.Add(new BoundingBox(newPosBasedOnOrigin, b.Size));
        }
        return newBounds;
    }

_方向是通过从目标位置减去射弹的位置并归一化来计算的。我用这个方法来确定炮弹是否与另一个实体相撞:

        public bool ProjectileCollision(Entity e, Projectile entity2)
    {
        if (entity2.CanCollide)
        {
            foreach(GameObject.BoundingBox b in entity2.BoundingBox)
            {
                foreach(GameObject.BoundingBox b2 in e.BoundingBox)
                {
                    if (b2.Intersect(b) && (entity2.IgnoredEntities.Contains(e.Type) == false))
                    {
                        entity2.IsActive = false;
                        e.Health -= entity2.Damage;
                        return true;
                    }
                    return false;
                }
            }
            return false;
        }
        return false;
    }

这是我的边界框交集方法:

        public bool Intersect(BoundingBox intersected)
    {
        if ((_pos.Y < intersected.Pos.Y + intersected.Size.Y) && (_pos.Y + _size.Y > intersected.Pos.Y) && (_pos.X + _size.X > intersected.Pos.X) && (_pos.X < intersected.Pos.X + intersected.Size.X))
        { return true; }
        return false;
    }

编辑:在进一步的测试中,如果玩家根据左上角命中,投射物似乎总是会检测到命中(现在我查看了我的交集代码,这很有道理)。有没有其他方法可以重写我的Intersect方法,使用比左上角更准确的方法?

第二版:我为某些物体画了命中框,这是我抓到长矛穿过玩家的一个例子:

https://i.stack.imgur.com/WcrKW.jpg

玩家是较大的粉红色方块。点击框没有被正确翻译,但它不应该停止工作,对一些人来说,对其他人来说,不是吗?

穿过其他实体的投射物

这种情况可能发生,因为速度高,物体小,炮弹可以穿过物体。除了检查对象是否相交外,还必须检查对象是否会相交,以检查对象是否在火线上。你可以通过光线投射来实现这一点。

在像您这样的情况下,我有一个函数可以检查对象是否靠近其他对象。简单地检查对象是否在其他对象的某个半径内。如果是的话,我会检查物体是否朝着另一个物体飞行,并检查它们之间的距离。当距离非常近时,碰撞就发生了。