我目前正在使用 C# 和 XNA 制作游戏,并且我已经实现了一种类似于Minecraft的块功能,除了从自上而下的角度。添加块是通过使用块列表及其向量来实现的(这样当有人尝试加载游戏时我可以重新添加所有块)。这一直运行良好,但我发现(在游戏中添加 4 个新块之后)更新每个块会导致大量延迟。
我已经实现了一个函数来检查块边界框是否在视口范围内:
for (int b = 0; b < blocklist.Count; b++)
{
if (view.Contains((int)blocklist[b].blockposition.X, (int)blocklist[b].blockposition.Y))
{
blocklist[b].visible = true;
}
else
{
blocklist[b].visible = false;
}
}
如果visible
equals true
,则绘制该块,但是,尽管如此,我仍然有些滞后,所以我想知道是否可以从此限制更新方法:
foreach (Builder b in blocklist)
{
b.Update();
}
对此:
foreach (Builder b in blocklist)
{
if (b.visible == true)
{
b.Update();
}
}
如果它们不在屏幕上,这会忽略更新块吗?
感谢您的任何输入和性能提示!
编辑:我一直在尝试实现你的数组想法,但我遇到了一些问题
if (player.Builder == true && player.LMBpressed == true && blockspawnamount >= placeblock && collisionengine.connecting <= 0)
{
if (build.BlockID == 1 && menu.open == false)
{
position = new Vector2((int)(cursor.cursorPos.X/ 58) * 58, (int)(cursor.cursorPos.Y / 58) * 58);
blocktex1 = grass1;
Builder[,] blocks = new Builder[grass1.Width, grass1.Height];
Builder block = blocks[x,y];
for (int x = view.Left; x < view.Right; ++x)
{
for (int y = view.Top; y < view.Bottom; ++y)
{
blocks[x,y].Update();
}
}
blockpos1.Add(position);
placeblock = 200.0f;
}
}
我遇到的问题是:
Builder block = blocks[x,y];
它说索引超出了数组的范围。
现在来解释这是如何工作的。单击后,位置设置为光标位置除以块纹理宽度(在这种情况下为 int 58),然后将块添加到列表中并稍后绘制。我没有单独的 Blocks 类来管理块的类型,但是 Builder 类控制放置块的放置和类型。
现在这是我的问题:您是否像通常添加到列表一样添加到数组中?然后你能把它画成一个列表吗?
Also: due to the fact that the Builder class controls the placing of the blocks, I can't remove the position variable, if I do, there will be no position to place the blocks