C#将纹理内容路径保存为字符串

时间:2011-09-14 16:04:24

标签: c# string xna textures

我想知道是否有一种简单的方法可以在字符串中存储纹理的路径。 我想知道这是因为我正在为游戏使用保存系统,我需要在文件中存储纹理的路径以便稍后加载它。 我尝试过使用Texture2D.Name,但只返回“”或null。 如果我无法获得完整的路径,那么至少我想得到纹理的名称。

编辑:我认为我解释得有点糟糕,或者我不能正确理解答案,我会解释一下新的尝试。

我制作了一个脚本,可以保存位置,HP等“敌人”课程。然后将其存储在\ My Documents文件夹中的.txt文件中。一旦我想要重新加载信息,我就创建一个新的Enemy实例(Vector2,int)。然后我加载信息并使用int.Parse将我的字符串转换为int > new Enemy(new Vector2(int.Parse(string1), int.Parse(string2)), int.Parse(string3)) <

我当时想要的是以某种方式保存纹理的名称,以便稍后使用上面提到的类似方法将其加载回来。 (以字符串形式从.txt中检索)

4 个答案:

答案 0 :(得分:1)

大多数对象没有可用的名称,即使它们可能没有必要安全地用作文件名。

除非你有充分的理由期待对象上的好名字并实际使用它,否则我建议只使用Guid.NewGuid().toString()作为文件名 - 安全且独特。

答案 1 :(得分:1)

Texture2D严格来说是一个内存中的对象,Texture2D与文件之间没有关系(除了可以从文件中加载和保存Texture2D)。如果你想记住你加载它的文件名,你应该在加载纹理时保持文件名。

编辑回复您的评论:

假设您没有谈论屏幕截图,您需要执行以下操作:

FileStream fs = new FileStream("myFile.png", FileMode.OpenOrCreate);
myTexture.SaveAsPng(fs, myTexture.Width, myTexture.Height);
fs.Flush();

答案 2 :(得分:0)

ContentManager具有RootDirectory属性,用于标识存储内容管理器内容的文件夹。该路径相对于可执行文件夹,因此您可以使用该路径构建内容路径,以及加载内容时指定的名称。

例如,如果您加载如下的.PNG纹理:

Texture2D texture = Content.Load<Texture2D>("SomeTexture")

然后可以像这样构建该纹理的路径:

string path = Content.RootDirectory + Path.DirectorySeparator + "SomeTexture" + ".png"

请注意,您需要了解文件类型以了解扩展名是什么。这也假设您没有更改内容项属性中的名称,因此您在Load调用中使用的键与文件名匹配,默认情况下会这样做。

如果您将内容存储在子文件夹中,那么您只需附加这些内容即可构建完整路径。

如果您需要完整的磁盘路径而不是相对路径,那么您可以获取可执行路径并将其添加到Content.RootDirectory。在这方面,谷歌是你的朋友。

答案 3 :(得分:0)

如果您的游戏是基于内容项目的,最简单的方法是使用内容项目路径根目录的路径亲属。

在您的内容项目中:

the relative path to file is "Textures/Animated/Rambo"

在你的剧本中:

 TextureAsset = "Textures/Animated/Rambo";

在你的引擎

 Texture = Content.Load<Texture2D>( "Textures/Animated/Rambo");     

 //Or if you don't want to load through Content

 Texture = Texture2D.LoadFromFile(Path.Combine(Content.RootDirectory, "Textures/Animated/Rambo")); 

如果您想保存,我建议您以相同的方式继续,并强制保存在内容项目文件夹中。