【问题标题】:Can't get SFML Music to work无法让 SFML 音乐正常工作
【发布时间】:2015-02-25 02:18:35
【问题描述】:

好的,只是一个警告:我真的是 C++ 新手,今年才开始编码。

所以,我一直在尝试编写此程序以使用 SFML 库在控制台中运行。过去我在试图让图书馆工作时遇到问题,但现在我很好。所以,我有一个播放音乐的功能,但是当我尝试在控制台中激活该功能时,我只得到返回值 0 并且控制台关闭。

相关代码:

void music ()
{
      system("CLS");

      sf::Music WorldOnFire;

      std::string musicInput;

      std::cout << "What would you like to listen to?" << std::endl;
      std::cout << "> Track 1 - \"I Don't Want to Set the World on Fire\" by The Ink Spots" << std::endl;
      std::cout << "> Back" << std::endl;

      std::getline(std::cin, musicInput);

      std::transform(musicInput.begin(), musicInput.end(), musicInput.begin(), ::toupper);
      musicInput.erase(std::remove(musicInput.begin(), musicInput.end(), ' '), musicInput.end());

      if (musicInput == "TRACK1" || musicInput == "TRACK1-\"IDON'TWANTTOSETTHEWORLDONFIRE\"" || musicInput == "TRACK1-\"IDON'TWANTTOSETTHEWORLDONFIRE\"BYTHEINKSPOTS" || musicInput == "\"IDON'TWANTTOSETTHEWORLDONFIRE\"" || musicInput == "IDON'TWANTTOSETTHEWORLDONFIRE")
      {
          if (!WorldOnFire.openFromFile("WorldOnFire.ogg"))
          {
               std::cout << "Could not open file. File corrupted or missing." << std::endl;
               std::cin.ignore();
               music();
          }
          WorldOnFire.play();
      }

      else if (musicInput == "BACK")
      {
          system("CLS");
          activitypage ();
      }
}

这里是所有代码,因个人原因有遗漏。 Source

【问题讨论】:

  • 出戏后你还在等吗?因为音乐与主线程并行运行(在音乐停止之前阻塞主线程会很愚蠢)
  • @Creris 我不确定你的意思。如果有帮助,我将上面的整个程序包括在内。

标签: c++ c++11 sfml


【解决方案1】:

WorldOnFire.play(); 是非阻塞的。因此,您的程序将在实际播放任何声音之前终止。

您需要在应用程序中添加某种循环。可以简单到贪婪while(isPlaying):

while (WorldOnFire.getStatus() == sf::Music::Playing);

或者更节能一点:

sf::sleep(WorldOnFire.getDuration() - WorldOnFire.getPlayingOffset());

【讨论】:

  • 谢谢!那确实奏效了。如果可以,你能告诉我这是什么意思吗?非阻塞?另外,如果我想让用户暂停或停止音乐,那么我会在一段时间后有一个 cin 吗?
  • @YuriKircovich 这意味着,正如我在评论中所说,它将开始在单独的线程中运行,并且不会阻止您的代码的执行。因此,您在 main 中的代码愉快地继续运行。要进一步了解这一点,您必须了解一些有关线程的知识。
  • @YuriKircovich,@Creris 刚刚说了关于非阻塞的一切。 ;-) 你可以使用cin 让用户给出一些指令,但老实说这将是一个混乱的代码......你最好学习如何使用SFML的窗口和图形模块。
  • @Hiura 是的,我认为那样会更容易,但我想在控制台中对其进行编码以赋予它复古的感觉。去寻找辐射的外观。也可以用图形来做到这一点,但我并没有打算这样做。
猜你喜欢
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
相关资源
最近更新 更多