如何创建平铺系统

时间:2012-09-27 02:18:53

标签: c# xna

不是为每个磁贴创建单独的案例,更好的方法是什么?

public void Draw(SpriteBatch spriteBatch, Level level)
    {
        for (int row = 0; row < level._intMap.GetLength(1); row++) {
            for (int col = 0; col < level._intMap.GetLength(0); col++) {
                switch (level._intMap[col, row]) {
                    case 0:
                        spriteBatch.Draw(_texture, new Rectangle(row * _tileWidth, col * _tileHeight, _tileWidth, _tileHeight), new Rectangle(0 * _tileWidth, 0 * _tileHeight, _tileWidth, _tileHeight), Color.White);
                        break;
                    case 1:
                        spriteBatch.Draw(_texture, new Rectangle(row * _tileWidth, col * _tileHeight, _tileWidth, _tileHeight), new Rectangle(1 * _tileWidth, 0 * _tileHeight, _tileWidth, _tileHeight), Color.White);
                        break;
                    case 2:
                        spriteBatch.Draw(_texture, new Rectangle(row * _tileWidth, col * _tileHeight, _tileWidth, _tileHeight), new Rectangle(2 * _tileWidth, 0 * _tileHeight, _tileWidth, _tileHeight), Color.White);
                        break;
                    case 3:
                        spriteBatch.Draw(_texture, new Rectangle(row * _tileWidth, col * _tileHeight, _tileWidth, _tileHeight), new Rectangle(3 * _tileWidth, 0 * _tileHeight, _tileWidth, _tileHeight), Color.White);
                        break;

                }
            }
        }
    }

2 个答案:

答案 0 :(得分:6)

不需要case语句,只需使用变量。

var n = level._intMap[col, row];
spriteBatch.Draw(_texture, 
    new Rectangle(row * _tileWidth, col * _tileHeight, _tileWidth, _tileHeight), 
    new Rectangle(n * _tileWidth, 0 * _tileHeight, _tileWidth, _tileHeight), Color.White
);

如果您需要将输出限制为值0-3(因为case语句的效果),那么最好使用条件if (n >= 0 && n <= 3) { }

答案 1 :(得分:1)

我认为做这样的事情的好方法是制作“Tile”课程。该类可以具有纹理的Texture2D属性。然后在Tile类中有一个draw方法,可以在游戏的draw方法中调用。

你的Level类可以有一个Tiles数组而不是整数。

那么你的Draw调用会是这样的:

public void Draw(SpriteBatch spriteBatch, Level level)
    {
        for (int row = 0; row < level.tileMap.GetLength(1); row++) {
            for (int col = 0; col < level.tileMap.GetLength(0); col++) {
                level.tileMap[col, row].Draw(spriteBatch);;
            }

        }
    }