Monogame - 加载瓷砖

时间:2016-04-10 19:44:06

标签: c# xna monogame

我在将一些瓷砖加载到游戏中时遇到了一些问题。我的游戏世界目前的像素大小为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;

1 个答案:

答案 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);
}

这就是我认为你所追求的目标。如果我走错了路,请告诉我,我会调整答案。我确实跳过了一些更为细节的细节,但是如果你有任何问题,那就有链接,你可以提出更多要求。

已编辑:绘图部分不是代码格式