Texture2D.GetData()返回不同的数据

时间:2013-12-03 20:59:11

标签: c# .net xna

我正在使用Texture2D.GetData()方法创建Tilemap。这总是在我第一次执行时工作,但第二次该方法只返回其他颜色,混淆整个算法。我完全没有理由这样做。

我的代码:

switch (KartenID)
{
    case 1: WasserKarte = Content.Load<Texture2D>("Karte/Karte1");
            break;
    case 2: WasserKarte = Content.Load<Texture2D>("Karte/Karte2");
            break;
    default:WasserKarte = Content.Load<Texture2D>("Karte/StandardKarte");
            break;
}

KARTE_BREITE = WasserKarte.Width;
KARTE_HOEHE = WasserKarte.Height;

Color[] c = new Color[KARTE_BREITE* KARTE_HOEHE];

WasserKarte.GetData<Color>(c);
//and so on...

我现在真的很沮丧。我无法确定Content.Load<>是否返回错误的纹理,但我不这么认为。这是我第二次运行此代码而不重新启动应用程序。

我真的很感激帮助。

1 个答案:

答案 0 :(得分:0)

相同的纹理应始终返回相同的颜色数据。例如:

var texture = Content.Load<Texture2D>("img");
var clr = new Color[texture.Width*texture.Height];
texture.GetData(clr);
texture = Content.Load<Texture2D>("img");
var clr2 = new Color[texture.Width*texture.Height];
texture.GetData(clr2);
for (int i = 0; i < clr.Length; i++)
{
    if (clr[i] != clr2[i])
    {
        // never gets hit
        Console.WriteLine("Error - color {0} != color {1}", clr[i], clr2[i]);
    }
}

由于你没有提供更多的代码,我只能假设,你在运行时做了一些不是故意对纹理的东西。但是,有一种简单的方法可以解决您的问题并同时优化代码。创建用于存储纹理信息的类,如下所示:

class Resource
{
    public Texture2D Texture;
    public Color[] ColorData;
}

Dictionary<string, Resource> Resources;

每次需要获取颜色信息时,不要调用Content.Load,而是读取关卡中使用的所有纹理,然后分配纹理标识符并仅为每个纹理获取一次颜色数据。稍后只需从资源中重用已加载的颜色数据:

var colorData = Resource["KartenID"].ColorData;
// do something with color data

当然这只是游戏资源管理的一个非常简单的例子,你可以编写更复杂的资源管理器来满足你的需求。