for-in-loop / Condition仅用于List的第一个元素

时间:2011-08-03 21:52:19

标签: list xna foreach indexing for-in-loop

我搜索了三天但没有找到解决方案,这是代码:

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;
            }

        }

每个Block位置等于我可以通过单击屏幕创建的块,然后将新的块位置放入List中。基本上我的BlockPosition列表中有一个块列表。然后我为每个Blockposition传递条件,条件为每个BlockPosition创建一个矩形,为Player播放一个...如果发生碰撞,玩家将不会朝那个方向移动。当我尝试代码时,我的角色将只与List的第一个元素碰撞,而不是其他元素,如果我删除了第一个元素,它将与下一个元素发生碰撞但不会碰撞其他元素。所有变量都很精细我知道它因为我试图用这样的代码替换这个代码:

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];

                }
            }
        }

同样的事情,但在这里如果碰撞我删除List的元素,它是相同的条件但是当我尝试它时它将检测所有元素并删除我触摸的元素。我尝试了foreach函数,得到了相同的结果。怎么了?我已经用变量做了很多事情所以我确定这个问题不是来自他们的价值观,而是来自于我对他们所做的事情。请帮忙! (:

1 个答案:

答案 0 :(得分:1)

发现我必须像这样打破循环:

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;
                break;
            }
            else
            {
                c = 1;
            }
        }

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

    }