我已经找了三天了,也没有找到解决方案,代码如下:
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创建一个矩形,为玩家创建一个...如果发生碰撞,玩家就不会朝那个方向移动。当我尝试代码时,我的角色将只与列表中的第一个元素冲突,而不会与其他元素冲突,如果我删除第一个元素,它将与下一个元素冲突,但不会与其他元素冲突。所有的变量都很好,我知道这一点,因为我试着用下面这样的代码替换这段代码:
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变量做了很多事情,所以我确信问题不是来自于它们的值,而是我对它们做了什么。帮帮忙!(:
发布于 2011-08-04 09:00:45
为了提高可读性,请考虑如下内容:
if (GlobalClass.BlocksPositions.All(x => !DoesIntersect(Position, x))
Position.X += speed;不仅目的更容易推断,而且你所犯的特定错误也不会出现。
发布于 2011-08-04 08:37:27
如果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-04 08:41:28
即使你找到了一个交叉点,你的循环也会继续。在if语句的true子句中需要一个中断符。
https://stackoverflow.com/questions/6934861
复制相似问题