从Texture2D XNA获取每个像素颜色的数组?

时间:2016-07-18 17:46:13

标签: c# colors xna

我有一个包含关卡布局的图像,我想通过从图像中读取每个像素颜色并绘制相应的块来加载游戏中的关卡。我正在使用此代码:

public void readLevel(string path, GraphicsDevice graphics)
    {
        //GET AN ARRAY OF COLORS
        Texture2D level = Content.Load<Texture2D>(path);
        Color[] colors = new Color[level.Width * level.Height];
        level.GetData(colors);

        //READ EACH PIXEL AND DRAW LEVEL
        Vector3 brickRGB = new Vector3(128, 128, 128);

        int placeX = 0;
        int placeY = 0;

        foreach (Color pixel in colors)
        {
            SpriteBatch spriteBatch = new SpriteBatch(graphics);
            spriteBatch.Begin();

            if (pixel == new Color(brickRGB))
            {
                Texture2D brick = Content.Load<Texture2D>("blocks/brick");
                spriteBatch.Draw(brick, new Rectangle(placeX, placeY, 40, 40), Color.White);
            }


            if(placeX == 22)
            {
                placeX = 0;
                placeY++;
            }
            else 
            spriteBatch.End();
        }
    }

但它只显示一个空白屏幕。帮助将不胜感激!

编辑:问题固定! (阅读下面的htmlcoderexe答案)此外,此代码还有另一个问题,请阅读here.

1 个答案:

答案 0 :(得分:1)

您的代码似乎将每个精灵绘制在与前一个像素偏移的一个像素处,但您的其他参数表明它们是40像素宽。 placeX和placeY需要乘以瓷砖的步幅(40)。

此外,在比较颜色的位中,您可能遇到浮点颜色值(0.0f-1.0f)和字节颜色一起使用的问题。

new Color(brickRGB)

这转换为:

new Color(new Vector3(128f,128f,128f))

因此它尝试从0.0f-1.0f范围构建一个颜色,将其剪切为1f(颜色的浮点输入允许的最大值),最后得到一个白色(255,255,255),这是不相等的到你的目标颜色(128,128,128)。

要解决此问题,请尝试更改

 Vector3 brickRGB = new Vector3(128, 128, 128);

 Color brickRGB = new Color(128, 128, 128);

和这部分

 if (pixel == new Color(brickRGB))

if (pixel == brickRGB)

您还需要使用placeX和placeY乘以40创建绘图矩形,但不要写入变量 - 现在只使用placeX * 40并稍后用常量替换它。