0

3日間検索しましたが、解決策が見つかりませんでした。コードは次のとおりです。

if (keyboardState.IsKeyDown(Keys.Right))
{
    for (int i = GlobalClass.BlocksPositions.Count - 1; i > 0; i--)
    {
        if (new Rectangle((int)GlobalClass.BlocksPositions[i].X, (int)GlobalClass.BlocksPositions[i].Y, bT.Width, bT.Height).Intersects(new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height)))
        {

            c = 0;
        }
        else
        {
            c = 1;
        }
    }

    if (c == 1)
    {
        Position.X += Speed;
    }

}

各ブロック位置は、画面をクリックして作成できるブロックと同じであり、新しいブロック位置がリストに追加されます。基本的に、BlockPositionリストにブロック座標のリストがあります。次に、各ブロック位置の条件を渡します。条件は、ブロック位置ごとに長方形を作成し、プレーヤー用に1つを作成します...衝突が発生した場合、プレーヤーはその方向に移動しません。コードを試してみると、私のキャラクターはリストの最初の要素とのみ衝突し、他の要素とは衝突しません。最初の要素を削除すると、次の要素と衝突しますが、他の要素とは衝突しません。このコードを次のようなものに置き換えようとしたので、すべての変数はFINEです。

if (keyboardState.IsKeyDown(Keys.Right))
{
    for (int i = GlobalClass.BlocksPositions.Count - 1; i > 0; i--)
    {
        if (new Rectangle((int)GlobalClass.BlocksPositions[i].X, (int)GlobalClass.BlocksPositions[i].Y, bT.Width, bT.Height).Intersects(new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height)))
        {
            GlobalClass.BlocksPositions.RemoveAt[i];

        }
    }
}

同じことですが、ここで衝突した場合、リストの要素を削除します。同じ状態ですが、試してみると、すべての要素が検出され、触れた要素が削除されます。foreach関数を試しましたが、同じ結果が得られました。どうしたの?私はすでにdoes変数を使って多くのことをしているので、問題はそれらの値からではなく、私がそれらを使って何をするかによって生じると確信しています。助けてください!(:

4

3 に答える 3

2

ifに評価された場合は何もしません。とにかく変数trueは必要ないようです。cどうですか...

if (keyboardState.IsKeyDown(Keys.Right))
{
    foreach( var pos in GlobalClass.BlocksPositions.Reverse() )
    {
        var rect = new Rectangle((int)pos.X, (int)pos.Y, bT.Width, bT.Height);
        var rectToTest = new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height);
        if (!rect.IntersectsWith(rectToTest))
            Position.X += Speed;
        else
            break;
    }
}

c実際に何らかの状態管理が必要な場合は、それをに追加し直すことができます。

于 2011-08-04T00:37:27.140 に答える
0

交差点を見つけてもループは続きます。ifステートメントのtrue節を中断する必要があります。

于 2011-08-04T00:41:28.253 に答える
0

読みやすくするために、次のようなことを検討してください。

if (GlobalClass.BlocksPositions.All(x => !DoesIntersect(Position, x))
     Position.X += speed;

目的を推測しやすいだけでなく、あなたが犯した特定の間違いは思い浮かびません。

于 2011-08-04T01:00:45.170 に答える