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

时间:2011-08-04 00:24:31

标签: c# list indexing conditional-statements 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函数,得到了相同的结果。怎么了?我已经用变量做了很多事情所以我确定这个问题不是来自他们的价值观,而是来自于我对他们所做的事情。请帮忙! (:

3 个答案:

答案 0 :(得分: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进行某种状态管理,那么您可以将其重新添加。

答案 1 :(得分:0)

即使你找到一个十字路口,你的循环也会继续。你需要在if语句的true子句中断。

答案 2 :(得分:0)

为了便于阅读,请考虑以下内容:

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

不仅目的更容易推断,而且你所犯的特殊错误也没有出现。