首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SFML声音不播放

SFML声音不播放
EN

Stack Overflow用户
提问于 2015-01-21 15:32:27
回答 2查看 5.5K关注 0票数 1

我试图在SFML中播放一个声音文件,但它没有播放。这是声音(警告:音量):http://freesound.org/people/thanvannispen/sounds/9550/。我使用了一个在线转换器将其转换为wav (http://audio.online-convert.com/convert-to-wav),但是声音在windows中播放得很好,所以这应该不是问题所在。

SoundManager.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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;
}

在这里,我加载声音:

代码语言:javascript
复制
Logger::print("Loading sound...");
if (!SoundManager::load()) {
    Logger::error("Failed to load sound! Exiting...");
    exit();
}
Logger::print("Sound loaded.");

在进入游戏循环之前,我就像这样玩它(我试着从多个地方调用它,没有工作)

代码语言:javascript
复制
SoundManager::sound["laughter"].play();

当我第一次尝试导入SFML\Audio.hpp时,它给了我一个关于找不到libsndfile-1.dll的错误,所以我把它复制/粘贴到文件夹中,现在它开始工作了,但是我不知道为什么会这样,因为我是静态链接的。这与我如何链接到SFML有关吗?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-21 15:41:38

来自SFML关于sf::Sound::setBuffer()的文档

需要注意的是,声音缓冲区没有被复制,因此,只要连接到声音,sf::SoundBuffer实例就必须保持活着。

laughterBuffer的情况并非如此。

我建议看看雷神资源工具资源

票数 2
EN

Stack Overflow用户

发布于 2016-05-24 15:14:43

不仅sf::SoundBuffer,而且sf::声音也需要活着。

您可以将它们都设置为类变量或全局变量(但在函数中不能设置变量,因为它将在执行后终止)。

例如:

.h文件

代码语言:javascript
复制
#pragma once
#include <SFML/Audio.hpp>
class SoundManager
{
private:
    sf::SoundBuffer missile_launch_buff;
    sf::Sound fire_sound;
public:
    SoundManager();
    void playMissileLaunch();

};

.cpp文件

代码语言:javascript
复制
#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";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28070966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档