0

我有一个有点像我的世界的游戏,但是从自上而下的角度来看,添加块是通过玩家左键单击它在指定位置添加块,右键单击放置的块删除块来完成的。

我遇到的问题是,当玩家左键单击时,它会将块及其位置添加到列表中(以便稍后保存到 XML),因此合乎逻辑的结论是,当玩家右键单击时,它会从游戏中删除所述块,以及它在列表中的位置。

这是我使用的产生滞后的方法:

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

为什么会产生如此多的滞后?我只需要澄清我做错了什么,所以我不会再犯了。

4

1 回答 1

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)
                    {

在这个版本中,基本上对于阻止列表 ( 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)
于 2013-06-20T04:24:04.067 回答