从数组生成平铺贴图

时间:2013-10-08 10:39:03

标签: c# enums tile

我一直在考虑尝试创建一个RPG游戏,一个带动作的简单游戏,拿起物品,打开门。

我一直在思考瓷砖地图引擎很长一段时间,但是找不到有用的东西:/

基本上我想要完成的是我有一个enum,如:

public enum tileSort { Dirt, Grass, Stone, Empty }

当引擎运行数组时,它会有0,1等等,我正在考虑一个switch语句,如:

switch(tileSort) 
{ 
    case '0':  tileList.Add(Content.Load<Texture2D>("Tiles/grass")) 
}

问题在于我不知道如何使这成为可能,我能够创建的所有内容都是一个贯穿始终的引擎,并根据您首先加载到游戏中的内容生成。

我知道这很令人困惑,因为我不善于解释自己。

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可以使用一些工具来帮助您:

我相信你能找到很多其他人。

关于您编写​​的代码片段,您不想调用

Content.Load<Texture2D>("Tiles/grass")

单个纹理多次。仅加载每个纹理一次并多次打印相同的资源。你可以这样:

var tileList = new List<Texture2D>();
string[] tiles = { "dirt", "grass", "stone", "empty" };

foreach (var s in tiles) {
    tileList.Add(Content.Load<Texture2D>("Tiles/" + s));
}

现在每个纹理只加载一次,您可以使用tileList[index].

访问它

下一步是在屏幕上打印瓷砖。我假设您已将瓷砖加载到带有图块索引的二维数组中。

int[,] tileMap = {{1, 2, 0}, {0, 1, 2}, {3, 3, 1},};

for (int i = 0; i < 3; ++i)
    for (int j = 0; j < 3; ++j)
        spriteBatch.Draw(tileList[tileMap[i, j]], new Vector2D(50*i, 50*j), Color.White);
        // Assuming the tiles are 50x50 pixels

本教程通过更多详细信息教您想要的内容:http://www.xnaresources.com/?page=Tutorial:TileEngineSeries:1

答案 1 :(得分:0)

要绘制平铺地图,请使用此伪代码

mapPlaceX = 0;
mapPlaceY = 0;

for (var y=0; y<TILEMAP_ARRAY.length; y++) {    

    mapPlaceX = 0;
    if (y != 0) { mapPlaceY += 30; }

        for (var x=0; x<TILEMAP_ARRAY[y].length; x++) {

                if (TILEMAP_ARRAY[y][x] == '0') { 
                    // draw image here  
                }           
                mapPlaceX += 30;

        }       
}

如果数组X和Y等于“ 0”,则遍历整个数组并绘制特定图像。

对于碰撞,请使用此:

var desiredX = playerX + pAngx;
var desiredY = playerX + pAngy; 

var indX = desiredX / 30;
var indY = desiredY / 30;

var cell = TILEMAP_ARRAY[indY][indX];

if (cell == 0) {
    // collision so don't move

}
else {
    // move

}

这将找到要移动到的数组中的单元格,如果它不等于0,则将移动。