从 Texture2D XNA 获取每个像素颜色的数组?
Get an array of each pixels color from Texture2D 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 的回答)此外,这段代码还有另一个问题,请阅读
您的代码似乎将每个精灵绘制为与前一个精灵偏移一个像素,但您的其他参数表明它们的宽度为 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,稍后用常量替换它。
我有一个包含关卡布局的图像,我想通过从图像中读取每个像素颜色并绘制相应的块来加载游戏中的关卡。我正在使用此代码:
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 的回答)此外,这段代码还有另一个问题,请阅读
您的代码似乎将每个精灵绘制为与前一个精灵偏移一个像素,但您的其他参数表明它们的宽度为 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,稍后用常量替换它。