SFML 声音不播放
SFML Sound not playing
我正在尝试播放 SFML 中的声音文件,但无法播放。这是声音(警告:音量过大):http://freesound.org/people/thanvannispen/sounds/9550/. I've used an online converter to convert it to wav (http://audio.online-convert.com/convert-to-wav) 但声音在 windows 中播放正常,所以这不应该是问题所在。
SoundManager.h
#pragma once
#include <SFML\Audio.hpp>
#include <map>
class SoundManager
{
public:
SoundManager();
~SoundManager();
static bool load();
static std::map<std::string, sf::Sound> sound;
};
SoundManager.cpp
#include "SoundManager.h"
#include <SFML\Audio.hpp>
#include <map>
std::map<std::string, sf::Sound> SoundManager::sound = std::map<std::string, sf::Sound>();
SoundManager::SoundManager()
{
}
SoundManager::~SoundManager()
{
}
bool SoundManager::load() {
sf::SoundBuffer laughterBuffer;
if (!laughterBuffer.loadFromFile("data/sound/laughter.wav")) {
return false;
}
sf::Sound laughter;
laughter.setBuffer(laughterBuffer);
SoundManager::sound["laughter"] = laughter;
}
我在这里加载声音:
Logger::print("Loading sound...");
if (!SoundManager::load()) {
Logger::error("Failed to load sound! Exiting...");
exit();
}
Logger::print("Sound loaded.");
我在进入游戏循环之前就这样玩了(我试过从多个地方调用它;none 工作)
SoundManager::sound["laughter"].play();
当我第一次尝试导入 SFML\Audio.hpp 时,它给我一个关于找不到 libsndfile-1.dll 的错误,所以我 copy/pasted 它进入文件夹,现在它可以工作了,但我不确定为什么会这样,因为我是静态链接的。这可能与我链接到 SFML 的方式有关吗?
sfml-main.lib
sfml-network-s.lib
ws2_32.lib
sfml-audio-s.lib
sndfile.lib
openal32.lib
sfml-window-s.lib
sfml-system-s.lib
opengl32.lib
gdi32.lib
winmm.lib
sfml-graphics-s.lib
glew.lib
freetype.lib
jpeg.lib
来自关于 sf::Sound::setBuffer()
的 SFML 文档:
It is important to note that the sound buffer is not copied, thus the sf::SoundBuffer instance must remain alive as long as it is attached to the sound.
laughterBuffer
不是这种情况。
我建议看看 Thor resources or sftools resources。
不仅sf::SoundBuffer,sf::Sound也需要活着。
你可以将它们都设置为class变量或全局变量(但不是函数中的变量,因为它会在执行后被杀死)。
例如:
.h 文件
#pragma once
#include <SFML/Audio.hpp>
class SoundManager
{
private:
sf::SoundBuffer missile_launch_buff;
sf::Sound fire_sound;
public:
SoundManager();
void playMissileLaunch();
};
.cpp 文件
#include "SoundManager.h"
#include <iostream>
using namespace std;
SoundManager::SoundManager()
{
missile_launch_buff.loadFromFile("sound/missile_launch.wav");
}
void SoundManager::playMissileLaunch()
{
fire_sound.setBuffer(missile_launch_buff);
fire_sound.play();
cout << "Missile launch sound \n";
}
我正在尝试播放 SFML 中的声音文件,但无法播放。这是声音(警告:音量过大):http://freesound.org/people/thanvannispen/sounds/9550/. I've used an online converter to convert it to wav (http://audio.online-convert.com/convert-to-wav) 但声音在 windows 中播放正常,所以这不应该是问题所在。
SoundManager.h
#pragma once
#include <SFML\Audio.hpp>
#include <map>
class SoundManager
{
public:
SoundManager();
~SoundManager();
static bool load();
static std::map<std::string, sf::Sound> sound;
};
SoundManager.cpp
#include "SoundManager.h"
#include <SFML\Audio.hpp>
#include <map>
std::map<std::string, sf::Sound> SoundManager::sound = std::map<std::string, sf::Sound>();
SoundManager::SoundManager()
{
}
SoundManager::~SoundManager()
{
}
bool SoundManager::load() {
sf::SoundBuffer laughterBuffer;
if (!laughterBuffer.loadFromFile("data/sound/laughter.wav")) {
return false;
}
sf::Sound laughter;
laughter.setBuffer(laughterBuffer);
SoundManager::sound["laughter"] = laughter;
}
我在这里加载声音:
Logger::print("Loading sound...");
if (!SoundManager::load()) {
Logger::error("Failed to load sound! Exiting...");
exit();
}
Logger::print("Sound loaded.");
我在进入游戏循环之前就这样玩了(我试过从多个地方调用它;none 工作)
SoundManager::sound["laughter"].play();
当我第一次尝试导入 SFML\Audio.hpp 时,它给我一个关于找不到 libsndfile-1.dll 的错误,所以我 copy/pasted 它进入文件夹,现在它可以工作了,但我不确定为什么会这样,因为我是静态链接的。这可能与我链接到 SFML 的方式有关吗?
sfml-main.lib
sfml-network-s.lib
ws2_32.lib
sfml-audio-s.lib
sndfile.lib
openal32.lib
sfml-window-s.lib
sfml-system-s.lib
opengl32.lib
gdi32.lib
winmm.lib
sfml-graphics-s.lib
glew.lib
freetype.lib
jpeg.lib
来自关于 sf::Sound::setBuffer()
的 SFML 文档:
It is important to note that the sound buffer is not copied, thus the sf::SoundBuffer instance must remain alive as long as it is attached to the sound.
laughterBuffer
不是这种情况。
我建议看看 Thor resources or sftools resources。
不仅sf::SoundBuffer,sf::Sound也需要活着。
你可以将它们都设置为class变量或全局变量(但不是函数中的变量,因为它会在执行后被杀死)。
例如:
.h 文件
#pragma once
#include <SFML/Audio.hpp>
class SoundManager
{
private:
sf::SoundBuffer missile_launch_buff;
sf::Sound fire_sound;
public:
SoundManager();
void playMissileLaunch();
};
.cpp 文件
#include "SoundManager.h"
#include <iostream>
using namespace std;
SoundManager::SoundManager()
{
missile_launch_buff.loadFromFile("sound/missile_launch.wav");
}
void SoundManager::playMissileLaunch()
{
fire_sound.setBuffer(missile_launch_buff);
fire_sound.play();
cout << "Missile launch sound \n";
}