我正在尝试创建一个 2d 滚动 XNA 游戏作为学习练习,但在滚动背景方面遇到了一些问题。我正在从文本文件加载关卡,通过解析创建适当的图块并将它们存储在矩阵(图块 [,])中。
然后我有一个更新方法,它改变了瓷砖的位置,所以当它被重绘时它会移动。
目前,我在移动之前遍历所有图块以绘制它们。这显然不是很有效。理想情况下,我只想在屏幕上绘制图块。我可以通过获取视口并使用图块的高度/宽度来确定屏幕上可以容纳多少图块并仅循环遍历这些图块,如下所示:
private void DrawTiles(SpriteBatch spriteBatch)
{
float tileWidth = 40;
float tileHeight = 32;
for (int y = 0; y < (int)Math.Ceiling(mViewport.Height / tileHeight); ++y)
{
for (int x = 0; x < (int)Math.Ceiling(mViewport.Width / tileWidth); ++x)
{
tiles[x, y].Draw(spriteBatch);
}
}
}
但是,这只会在原始视口中绘制文件。外面的瓷砖永远不会被绘制,即使它们的位置确实出现了。
我认为这可以通过使用计数器来开始和结束循环来解决,每次调用 draw 方法时都会增加它。但是,我不认为这是一个很好的解决方案,但是我想不出更好的方法来确保只绘制视口中的图块。