首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for-in-loop/条件仅用于列表的第一个元素

for-in-loop/条件仅用于列表的第一个元素
EN

Stack Overflow用户
提问于 2011-08-04 08:24:31
回答 3查看 144关注 0票数 0

我已经找了三天了,也没有找到解决方案,代码如下:

代码语言:javascript
复制
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列表中有一个块坐标列表。然后我为每个区块位置传递条件,条件为每个blockposition创建一个矩形,为玩家创建一个...如果发生碰撞,玩家就不会朝那个方向移动。当我尝试代码时,我的角色将只与列表中的第一个元素冲突,而不会与其他元素冲突,如果我删除第一个元素,它将与下一个元素冲突,但不会与其他元素冲突。所有的变量都很好,我知道这一点,因为我试着用下面这样的代码替换这段代码:

代码语言:javascript
复制
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函数,得到了相同的结果。怎么了?我已经用do变量做了很多事情,所以我确信问题不是来自于它们的值,而是我对它们做了什么。帮帮忙!(:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-04 09:00:45

为了提高可读性,请考虑如下内容:

代码语言:javascript
复制
if (GlobalClass.BlocksPositions.All(x => !DoesIntersect(Position, x))
     Position.X += speed;

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

票数 0
EN

Stack Overflow用户

发布于 2011-08-04 08:37:27

如果if的计算结果为true,则无需执行任何操作,而且似乎也不需要c变量。不如..。

代码语言:javascript
复制
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来进行某种状态管理,那么您可以重新添加它。

票数 2
EN

Stack Overflow用户

发布于 2011-08-04 08:41:28

即使你找到了一个交叉点,你的循环也会继续。在if语句的true子句中需要一个中断符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6934861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档