-2

我正在 Xna 4.0 中制作 2D 射击游戏

我的游戏中有一颗子弹,我试图让它与敌人相撞,但是当我尝试检查它的位置是否等于敌人时,它没有

子弹射击:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework;

namespace Moba_Turtle1
{
    class Bullet
    {
    Texture2D bulText;

    float timer;
    float interval = 2;

    public bool shot = false;

    public Vector2 velocity;
    bool canChange = true;

    public Vector2 position;
    public Vector2 lastPosition;
    Vector2 orgin;

    public Bullet (Texture2D newText, Vector2 newPos)
    {
        bulText = newText;
        position = newPos;
    }

    public void Update (GameTime gameTime)
    {


        if (Moba_Turtle1.Character.direction == true && canChange == true)
        {
            canChange = false;
            velocity.X = 50f;
        }

        if (Moba_Turtle1.Character.direction == false && canChange == true)
        {
            canChange = false;
            velocity.X = -50f;
        }


        position = position + velocity;
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(bulText, position, null, Color.White, 0f, orgin, 1.0f, SpriteEffects.None, 0);
    }
}

}

碰撞检查:

foreach (BeeAi bee in Bees)
        {
            {
                if (bullet.position == bee.position)
                    bulCol = true;
            }
        }

        if (bulCol == true)
            bullets.Clear();

请帮忙!

4

3 回答 3

1
bullet.position == bee.position

position是 a Vector2,它由float坐标组成。子弹和蜜蜂几乎不可能完全处于相同的位置以达到漂浮的精度!

您需要根据两个边界矩形是否重叠来重新考虑您的碰撞检测。

于 2013-03-14T22:29:13.477 回答
0

问题是,正如其他人所提到的,您几乎永远不会击中与蜜蜂完全相同的位置。

一个简单的解决方法是让你的循环像这样:

foreach (BeeAi bee in Bees)
{
    foreach (Bullet bullet in bullets)
    {
        if ((bullet.position - bee.position).Length() <= 10f)
        {
            bulCol = true;
        }
    }
}

但如果子弹的速度足够高,这也很容易失败。

我建议你研究一下 Ray、BoundingSphere、BoundingBox 和 Rectangle。

如果您的子弹总是仅水平移动或仅垂直移动,那么最简单和最好的解决方法是制作一个跨越子弹移动最后一帧距离的矩形,并使用 Rectangle.Contains 或其他东西。

于 2013-03-15T11:37:14.783 回答
0

不要比较浮点数,因为除非它们完全相同,否则它们不会相等。因此,如果您正在计算位置,您将不会得到匹配。您应该测试项目符号位置是否在一个小范围的值内。

于 2013-03-14T22:28:45.330 回答