-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は、Vector2座標でfloat構成される です。弾丸とハチが正確に同じ位置にある可能性は非常に低いです。

2 つの境界矩形が重なるかどうかに沿って、衝突検出を再考する必要があります。

于 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

float は比較しないでください。まったく同じでない限り、等しくはなりません。したがって、位置を計算している場合、一致は得られません。箇条書きの位置が小さな値の範囲内にあるかどうかをテストする必要があります。

于 2013-03-14T22:28:45.330 に答える