我在将一些瓷砖加载到游戏中时遇到了一些问题。我的游戏世界目前的像素大小为770x450。我在位置(0, 330)
加载了一个图块,但是我想制作一个循环,沿着x轴复制并加载图块,直到达到(770, 330)
。我可以简单地复制代码并粘贴代码以分别加载每个磁贴,但这将是错误的代码。
这是我当前的Initialize()
代码:
protected override void Initialize()
{
position = new Vector2(0, 330);
// x axis = 770 pixel
// y axis = 450 pixels
this.IsMouseVisible = true;
base.Initialize();
}
我的图块声明为Texture2D gameTile;
。
答案 0 :(得分:2)
http://xnaresources.com/default.asp?page=Tutorial:TileEngineSeries:1
该链接提供了一个教程,涵盖了创建磁贴引擎所需的大部分内容。
看起来您正在应用程序初始化函数中创建切片。你最好创建一些瓦片管理器来存储你需要的所有瓦片。
在创建切片方面,您可以使用结构数组或结构数组。对于第一个,您将创建一个至少存储图块位置的Tile类。如果使用spritesheet渲染切片,您还可以包含TileID以确定应该使用哪个切片进行绘制。
对于阵列结构,您可以存储将用于图块(在图块管理器内)的另一个Vector数组,以及另一个TileID数组。两种方法都有效。为了便于阅读和练习面向对象编程,我可能会推荐第一个。
Texture2D也应该只加载一次。你没有发布你加载的地方或你计划制作更多瓷砖的方式,所以我假设你的计划是为每个瓷砖加载texture2D,这是个坏主意。
最后,就循环而言,一旦你制作了你的tile类,你的tile管理器或初始化函数就会循环创建并设置每个tile的位置(伪代码):
int tileRowCount = mapSizeX / tileSizeX;
int tileColumnCount = mapSizeY / tileSizeY;
for(int rowIndex = 0; rowIndex < tileRowCount; rowIndex++)
{
for(int columnIndex = 0; columnIndex < tileColumnCount; columnIndex++)
{
tileList.Add(new Tile(new Vector2(columnIndex * tileSizeX, rowIndex * tileSizeY);
}
}
然后绘图:
foreach(Tile tile in tileList)
{
///not exact Draw call, not looking at the documents right now
tile.Draw(spriteBatch, tileTexture, tile.Position);
}
这就是我认为你所追求的目标。如果我走错了路,请告诉我,我会调整答案。我确实跳过了一些更为细节的细节,但是如果你有任何问题,那就有链接,你可以提出更多要求。
已编辑:绘图部分不是代码格式