1

与其为每个图块创建单独的案例,更好的方法是什么?

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;

                }
            }
        }
    }
4

2 回答 2

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) { }.

于 2012-09-27T02:21:58.687 回答
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);;
            }

        }
    }
于 2012-09-27T18:10:35.303 回答