其他分享
首页 > 其他分享> > 如何在不实际使用Content类的情况下加载MP3文件?

如何在不实际使用Content类的情况下加载MP3文件?

作者:互联网

我是使用C Sharp进行编程的初学者,并且正在使用XNA SDK.我正在尝试制作一个简单的游戏来帮助同班同学学习学校,我决定是否可以通过某种方式让他们在播放文件时将他们想听的音乐放在文件中,并且让游戏自动加载音乐文件,然后在播放列表中播放它们.

到目前为止,我可以通过检测文件路径名是否包含Contains(“.mp3”)来使游戏检测文件是否为音乐,但实际上我正在尝试将文件名加载到Song类型的列表中,使用for循环.代码看起来像这样.

(宣言)

List<Song> songsToPlay;
string[] fileNames

(初始化)

fileNames[] = Directory.GetFiles(".\Music")

(LoadContent)

for (int i = 0; i < fileNames.Count(); i++)
{
      if (fileNames[i].Contains(".mp3")
      {
          songsToPlay.Add(fileNames[i]);
      }
}

我一直在尝试找到一种将整个文件夹添加到Content Directory的方法,并使它执行更多操作

for (int i = 0; i < fileNames.Count(); i++)
{
    songsToPlay.Add(Content.Load<Song>("fileNames[i]") 
}

我一直找不到解决此问题的方法…有人知道如何进行这项工作,或者有更好的方法吗?

解决方法:

如果项目内容中包含文件,则应使用the ContentManager class.它不仅提供文件加载功能.例如,您可以在不再使用use Content.Unload to unload all your data时使用它.

无需避免该类. This page has an example准确显示您要执行的操作:

public static Dictionary<string, T> LoadContent<T>(
    this ContentManager contentManager, string contentFolder)
{
   var dir = new DirectoryInfo(contentManager.RootDirectory
       + "\\" + contentFolder);
   if (!dir.Exists)
      throw new DirectoryNotFoundException();

   var result = new Dictionary<string, T>();

   foreach (FileInfo file in dir.GetFiles("*.mp3"))
   {
      string key = Path.GetFileNameWithoutExtension(file.Name);

      result[key] = contentManager.Load<T>(
          contentManager.RootDirectory + "/" + contentFolder + "/" + key);
   }

   return result;
}

您可以像这样使用它:

var songs = Content.LoadContent<Song>("Songs");

对该代码稍作改进…

一旦上述代码正常工作,我还建议您进行一些更改:

var dir = new DirectoryInfo(
    System.IO.Path.Combine(contentManager.RootDirectory, contentFolder));

在可能的情况下,您不应该通过字符串串联来手动构建路径.我不知道您可以对ContentManager路径执行同样的操作,因此对于这种情况,您可能必须坚持使用字符串连接.

编辑:太多的类,您还没有在课堂上使用过

由于您尚未在课程中使用extension methodsthe static keyword,并且可能还没有使用字典,因此这是一种更简单的方法:

string contentFolder = "Music";
var dir = new DirectoryInfo(Content.RootDirectory + "\\" + contentFolder);

if (!dir.Exists)
{
    // Todo: Display a message to the user instead?
    throw new DirectoryNotFoundException();
}

string[] files = dir.GetFiles("*.mp3");

for (int i = 0; i < files.Count(); ++i)
{
    FileInfo file = files[i];
    string key = System.IO.Path.GetFileNameWithoutExtension(file.Name);

    var song = Content.Load<Song>(
        Content.RootDirectory + "/" + contentFolder + "/" + key);

    songsToPlay.Add(song);
}

Edit2:此第二个代码示例的一些说明

The DirectoryInfo class允许您加载目录,以便可以枚举其中的所有文件.

DirectoryInfo上的The GetFiles method允许您使用通配符样式模式匹配来枚举文件.文件的通配符模式匹配意味着在指定以下模式时:

> *.*-您正在寻找名为< anything>.< anything>的文件.
> * .mp3-您正在寻找< anything> .mp3

throw意味着抛出异常.这将有意停止执行代码,并显示正确的错误消息(“找不到目录”)和行号. There is a lot to learn about exception handling,所以在这里我不会尝试通过描述来做到合理.

GetFileNameWithoutExtension应该很明显,因为它的名字很好.

Content.RootDirectory + "/" + contentFolder + "/" + key

最后的代码将使用它可以理解的名称来构建一个包含内容根目录,歌曲的子目录以及每个文件名的字符串(因为它不知道文件扩展名).

var表示“我为其分配的任何类型”.这是捷径.例如,不要键入:

List<string> someList = new List<string>();

您输入:

var someList = new List<string>();

var必须知道赋值右侧的类型.这很有用,因为您可以avoid repeating yourself.

但是,使用var不会赋予该变量任何神奇的功能.声明变量后,您将无法分配其他类型的变量.这只是功能完全相同的捷径.

标签:xna,loading,c
来源: https://codeday.me/bug/20191201/2084271.html