我有一个类似于我的游戏的游戏,但是从上到下的角度来看,添加块是通过玩家左键单击它将块添加到指定位置来完成的,右键单击放置的块会删除块。
我遇到的问题是,当玩家左键单击时,它会将块及其位置添加到列表中(以便稍后保存到XML),因此逻辑结论是当玩家右键单击< / em>它从游戏中移除所述块,以及它从列表中的位置。
这是我使用的生成滞后的方法:
for (int b = 0; b < game.blocklist.Count; b++)
{
for (int v = 0; v < game.blockpos1.Count; v++)
{
if (game.blocklist[b].visible == true)
{
if (game.cursor.boundingbox.Intersects(game.blocklist[b].blockrectangle) && mousestate.RightButton == ButtonState.Pressed && game.player.Builder == true)
{
if (game.blocklist[b].blockposition.X == game.blockpos1[v].X && game.blocklist[b].blockposition.Y == game.blockpos1[v].Y)
{
game.blockpos1.RemoveAt(v);
game.blocklist.RemoveAt(b);
break;
}
}
}
}
}
现在这是我替换它的方法,它可以极大地减少延迟,并且仍能达到我想要的效果:
for (int b = 0; b < game.blocklist.Count; b++)
{
if (game.blocklist[b].visible == true)
{
if (game.cursor.boundingbox.Intersects(game.blocklist[b].blockrectangle) && mousestate.RightButton == ButtonState.Pressed && game.player.Builder == true)
{
if (game.blocklist[b].blockposition.X == game.blockpos1[b].X && game.blocklist[b].blockposition.Y == game.blockpos1[b].Y)
{
game.blockpos1.RemoveAt(b);
game.blocklist.RemoveAt(b);
break;
}
}
}
}
为什么会产生这么多滞后?我只需要澄清我做错了什么,所以我不再这样做了。
答案 0 :(得分:1)
for (int b = 0; b < game.blocklist.Count; b++)
{
for (int v = 0; v < game.blockpos1.Count; v++)
{
if (game.blocklist[b].visible == true)
{
在这个版本中,基本上对于blocklist(X)中的每个项目,无论它是否可见,你都在迭代blockpos1(Y)中的每个项目。所以你做X * Y循环。然后,您将其缩小为X循环,仅评估可见项目。
考虑到代码写在问题中的方式,我会在尝试循环之前检查这两件事
mousestate.RightButton == ButtonState.Pressed && game.player.Builder == true
因为在这些循环中它们永远不会改变。所以,如果他们不是真的开始,甚至不要打扰循环。
正如Preseton在评论中所说,没有必要将事情与真实比较....你只需要做
mousestate.RightButton == ButtonState.Pressed && game.player.Builder
和
if (game.blocklist[b].visible)