子弹碰撞

时间:2013-03-14 22:23:53

标签: c# xna

我正在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();

请帮助!

3 个答案:

答案 0 :(得分:1)

bullet.position == bee.position

positionVector2,由float坐标组成。子弹和蜜蜂极不可能与浮子的准确度完全相同!

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

答案 1 :(得分:0)

不要比较浮点数,因为除非它们完全相同,否则它们将不相等。因此,如果您计算的位置,您将无法获得匹配。您应该测试子弹位置是否在一小部分值范围内。

答案 2 :(得分: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或其他东西。

相关问题