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

标签 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<>返回错误的纹理,但我不这么认为。这是我第二次在不重新启动应用程序的情况下运行此代码。

非常感谢您的帮助。

最佳答案

相同的纹理应该总是返回相同的颜色数据。例如:

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

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

关于c# - Texture2D.GetData() 返回不同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20361528/

相关文章:

c++ - 无需运行必备软件的 DirectX 游戏

c# - 将 32768kb EGA 文件转换为 256x256 Texture2D?

C# 和 MS Access - 用于创建表、列并在应用程序启动时添加值的 SQL

c# - 作为当前用户使用 Web 服务添加列表项

c# - Web 服务和 wcf 之间的主要区别是什么?

.net - 模拟按钮上的 css 在开发和生产中显示不同

objective-c - 是否有与 XNA 的更新功能等效的 Objective-C?

c# - 如果单击周围的元素,则将焦点保留在 TextBox 中

没有 TransactionScope 的 .Net Core 事务装饰器

C# - 以分钟为单位计算时差