0

我正在尝试制作一个自动类型的瓷砖系统来根据我的 Texture Atlas 绘制我的 int[,] tileMap 但是当我运行代码时,我得到了整个东西并且纹理没有出现,我知道它的唯一方法是横向是因为用于绘制纹理的“颜色颜色”与 ClearScreen 的颜色不同。

平铺分类类:

    public Texture2D Texture { get; set; }
    public int Rows { get; set; }
    public int Columns { get; set; }
    public int totalTiles;
    public int _tileWidth;
    public int _tileHeight;
    public int[] tiles;
    public int[,] tileMap = new int[,] {
            {0,0,0,0,0,0,2,0,0,0,},
            {0,0,0,0,0,2,2,0,0,0,},
            {0,0,0,0,0,2,0,0,0,0,},
            {0,0,0,0,0,2,0,0,0,0,},
            {0,0,0,2,2,2,0,0,0,0,},
            {0,0,0,2,0,0,0,0,0,0,},
            {0,0,0,2,0,0,0,0,0,0,},
            {0,0,2,2,0,0,0,0,0,0,},
            {0,0,2,0,0,0,0,0,0,0,},
            {0,0,2,0,0,0,0,0,0,0,}
    };

    public Tile(Texture2D texture, int tileWidth, int tileHeight)
    {
        _tileWidth = tileWidth;
        _tileHeight = tileHeight;
        Texture = texture;
        totalTiles = Rows * Columns;

    }


    public void Update() {

    }

    public void Draw(SpriteBatch spriteBatch, Vector2 location)
    {

        for (int row = 0; row < tileMap.GetLength(1); row++) {

            for (int col = 0; col < tileMap.GetLength(0); col++) {

                switch (tileMap[row, col]) {
                    case 0:
                        spriteBatch.Draw(Texture, new Rectangle(row * _tileWidth, col * _tileHeight, _tileWidth, _tileHeight), new Rectangle(1 * _tileWidth, 1 * _tileHeight, _tileWidth, _tileHeight), Color.Transparent);
                        break;
                    case 2:
                        spriteBatch.Draw(Texture, new Rectangle(row * _tileWidth, col * _tileHeight, _tileWidth, _tileHeight), new Rectangle(2 * _tileWidth, 2 * _tileHeight, _tileWidth, _tileHeight), Color.Transparent);
                        break;
                    default:
                        break;
                }

            }

主班

public class Main : Microsoft.Xna.Framework.Game {
    // Basic code for drawing.
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Tile test;
    Texture2D texturePack;

    public Main() {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }


    protected override void Initialize() {

        base.Initialize();
    }


    protected override void LoadContent() {
        spriteBatch = new SpriteBatch(GraphicsDevice);

        texturePack = Content.Load<Texture2D>("AxiomTileSheet");
        test = new Tile(texturePack, 8, 8);
    }


    protected override void UnloadContent() {
    }


    protected override void Update(GameTime gameTime) {

        if (Keyboard.GetState().IsKeyDown(Keys.Escape))
            this.Exit();


        base.Update(gameTime);
    }


    protected override void Draw(GameTime gameTime) {
        GraphicsDevice.Clear(Color.White);

        spriteBatch.Begin();
        test.Draw(spriteBatch);
        spriteBatch.End();

        base.Draw(gameTime);
    }
}
4

1 回答 1

2

switch (tileMap[row, col]) 

应该

switch (tileMap[col, row])

当您使用 col 表示 x 值并使用 row 表示 y 时。

您还需要在矩形计算中切换它。

基于我的经验的另一个性能提示(正如 Andrew 提到的那样,这可能在每种情况下都不值得)而不是每帧创建新的矩形,而是在 Tile 类中定义 2 个矩形,并且每帧只更改 x 和 y 值

浮动

编辑:颜色问题==============================

您可以通过使用完全摆脱 switch case 构造

public void Draw(SpriteBatch spriteBatch)
        {
    for (int row = 0; row < tileMap.GetLength(1); row++) {
        for (int col = 0; col < tileMap.GetLength(0); col++)
            {
                        spriteBatch.Draw(_texture, new Rectangle(row * _tW, col * _tH, _tW, _tH), new Rectangle(tileMap[row, col] * _tW, tileMap[row, col] * _tH, _tW, _tH), Color.White);
            }
        }
        }

注意:_tH=_tileHeight, _tW=_tileWidth 我对此进行了测试,它对我来说就像一个魅力;)如果您想保留开关盒,请确保将 Color.White 设置为您的着色颜色(最后一个 spritebatch 参数)。并且您需要更正开关盒的值,因为您在地图定义中使用 0 和 2,但在开关盒中使用 0 和 1。将案例扩展到 3 个(因为您现在似乎有 4 个图块)也对我有用。

所以我认为你的问题是基于错误的颜色和案例结构中的错字。

希望这可以帮助 :)

于 2012-09-26T06:47:33.950 回答