gpt4 book ai didi

c++ - 声明 sf::SoundBuffer 会导致程序在终止时崩溃

转载 作者:行者123 更新时间:2023-12-03 01:43:35 24 4
gpt4 key购买 nike

我使用 SFML 已经很久了,但是直到现在我还没有使用过 Audio 模块。

我想为我的游戏添加声音效果,所以我的第一种方法与此类似...

class Deck : public sf::Drawable
{
public:
...

private:
sf::Sound shuffleSound;

...

static sf::SoundBuffer soundBuffer;
};

计划是初始化 soundBuffer一次做 shuffleSound.setBuffer(soundBuffer);在每个对象的构造函数中。但我得到了这个错误:
AL lib: (EE) alc_cleanup: 1 device not closed

Assertion failed: (lockret == althrd_success), function LockLists, file /Users/m/Desktop/tmp/openal/build_deps/openal-soft-openal-soft-1.17.2/Alc/ALc.c, line 776.
(lldb)

谷歌搜索此错误后,我在某处看到一条关于未将 SFML 资源置于全局范围内的模糊消息。计算 static变量是错误的原因,我试过这个:
class Deck : public sf::Drawable
{
public:
...

private:
sf::Sound shuffleSound;

...

static std::unique_ptr<sf::SoundBuffer> bufptr;
};

并通过调用 make_unique 初始化指针一次如果对象为空,则执行 shuffleSound.setBuffer(*bufptr)在构造函数中。

但是,我仍然得到同样的错误。顺便说一句,直到程序即将终止,错误才会发生。

任何帮助,将不胜感激。

最佳答案

我无法添加任何评论,因为我的声誉太低,所以我会写下答案。

一开始,我建议您创建一些可以保留所有资源的类。
检查这个:https://github.com/SFML/SFML-Game-Development-Book/tree/master/02_Resources/Include/Book

有 SFML Game Development 书的源代码 - 你可以在 SFML Github 上找到许多有用的 Material 。

因此,在您的情况下,您可以创建该类型的对象:ResourceHolder<sf::SoundBuffer, ID> mSoundHolder;其中 ID 是一些 enum键入以识别每个声音。

然后播放你的声音只需创建类型为 sf::Sound s 的对象并使用 s.setBuffer(mSoundHolder.getResource(<YOUR_ID>)s.play() .

确保 sf::Sound不是本地对象,因为它不会播放,因为它会自动快速销毁。然后在类里面创建它,或者如果您想同时播放更多声音,例如 std::list<sf::Sound> sounds它可以播放声音。要检查它是否已播放完毕,请使用:sound.getStatus() == sf::Sound::Stopped比较,然后从列表中删除声音。

您可以创建sf::Sound来自 sf::SoundBuffer 的对象使用 std::list 有什么帮助? .然后你可以简单地使用 emplace_back在您的列表对象上并传递您的sf::SoundBuffer作为论据。

希望能帮助到你。

关于c++ - 声明 sf::SoundBuffer 会导致程序在终止时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45403807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com