【问题标题】:C# Save a textures content path as stringC# 将纹理内容路径保存为字符串
【发布时间】:2011-09-14 16:04:23
【问题描述】:

我想知道是否有一种简单的方法可以将纹理的路径存储在字符串中。 我想知道这是因为我正在为游戏使用保存系统,我需要将纹理的路径存储在文件中以便以后加载它。 我试过使用 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 作为字符串检索)

【问题讨论】:

  • 为什么不建立一个纹理管理器,并在管理器中加载纹理时存储纹理路径。
  • 您是从磁盘动态加载纹理,还是您的内容项目的一部分?
  • 这是内容的一部分

标签: c# string xna textures


【解决方案1】:

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

编辑回应您的评论:

假设您不是在谈论屏幕截图,您需要执行以下操作:

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

【讨论】:

  • 保存到文件是我想知道怎么做的
  • 这不是我想的,但它可能会在不久的将来派上用场。我在想更多类似 StreamWriter.WriteLine(Texture2D."ThePathToTextureInContent") 的东西,然后粗略加载: String s = File.ReadAllLines(TheFileContainingTexturePath) Texture2D newTexture = Content.Load(s);
  • @user669415 是的,我认为没有办法完全按照您的要求进行操作。但是,您可以这样做: String s = "ThePathToTextureInContent"; Content.Load(s);您可以将“s”保存到文件中。就像我在原始答案中提到的那样,Texture2D 与文件没有关系,没有。你甚至可以在没有文件的情况下制作 Texture2D 对象。
【解决方案2】:

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

除非您有充分的理由期望您的对象具有良好的名称并实际使用它,否则我建议仅将 Guid.NewGuid().toString() 作为文件名 - 安全且唯一。

【讨论】:

    【解决方案3】:

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

    例如,如果您像这样加载 .PNG 纹理:

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

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      在您的内容项目中:

      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")); 
      

      如果你想保存,我建议你按照同样的方式进行,并强制保存在内容项目文件夹中。

      【讨论】:

        猜你喜欢
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-21
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        相关资源
        最近更新 更多