创建指向未符号char []的指针,然后将其传递给SF :: Soundbuffer :: LoadFromememor
Create pointer to unsigned char[] and pass it to sf::SoundBuffer::loadFromMemory
在我的游戏中,我有一个映射std::map<Sound, sf::SoundBuffer> mySounds
,我用作声音的资源持有人。
Sound
是一个看起来像这样的枚举:
enum class Sound {
SOUND_ONE,
SOUND_TWO,
SOUND_THREE,
NUMBER_OF_SOUNDS
};
现在,为了加载我当前使用sf::SoundBuffer::loadFromFile
的声音,代码看起来像这样:
std::vector<std::string> paths;
paths.resize(static_cast<unsigned int>(Sound::NUMBER_OF_SOUNDS));
paths[static_cast<std::size_t>(Sound::SOUND_ONE)] = "sound1.ogg";
paths[static_cast<std::size_t>(Sound::SOUND_TWO)] = "sound2.ogg";
paths[static_cast<std::size_t>(Sound::SOUND_THREE)] = "sound3.ogg";
for (std::size_t i = 0; i < static_cast<std::size_t>(Sound::NUMBER_OF_SOUNDS); ++i) {
mySounds[static_cast<Sound>(i)].loadFromFile("./data/" + paths[i]);
}
这很好。
现在解决问题:
对于我的发布构建,我想将所有声音转换为字节数组(使用称为BIN2H的工具),然后使用sf::SoundBuffer::loadFromMemory()
。
阵列看起来像这样:
unsigned char RES_SOUND_ONE[] = {0x4f,0x67,0x67,0x53,...};
unsigned char RES_SOUND_TWO[] = {0x52,0x88,0x29,0x47,...};
unsigned char RES_SOUND_THREE[] = {0x96,0x65,0x59,0x02,...};
如果我只有一个声音,我可以简单地写:
mySound.loadFromMemory(RES_SOUND_ONE, sizeof(RES_SOUND_ONE));
它将完美地工作。
我有多个声音,所以我正在考虑在循环内有一个指针(最初只是一个空指针)。
然后,我将根据我目前在哪个循环索引(请参阅下面的代码中的switch
)设置指针。
然后我将指针传递给数据到loadFromMemory
函数。
for (std::size_t i = 0; i < static_cast<std::size_t>(Sound::NUMBER_OF_SOUNDS); ++i) {
void *buffer = nullptr;
switch (static_cast<Sound>(i)) {
case Sound::SOUND_ONE: { buffer = (unsigned char*)RES_SOUND_ONE; } break;
case Sound::SOUND_TWO: { buffer = (unsigned char*)RES_SOUND_TWO; } break;
case Sound::SOUND_THREE: { buffer = (unsigned char*)RES_SOUND_THREE; } break;
}
mySounds[static_cast<Sound>(i)].loadFromMemory(buffer, sizeof(buffer));
}
SFML错误消息是:
Failed to open sound file from memory (format not supported)
我在做一些非常错误的事情
我还尝试了其他各种memcpy
,所有这些都导致故障大声笑
基本上我要问的是:如何创建指向未签名的char数组的指针并将其传递给SFML函数sf::SoundBuffer::loadFromMemory(const void *data, size_t sizeInBytes)
问题可能是您致电loadFromMemory()
。
尤其是,sizeof(buffer)
的值可能是基于指针所需的内存数量的常数。(例如64位平台上的8个字节。)
我怀疑这足以包含声音信息...:)
您想传递数组的大小。遵循您的模式:
for (size_t i = 0; i < static_cast<size_t>(Sound::NUMBER_OF_SOUNDS); ++i)
{
unsigned char *buf = nullptr;
size_t siz = 0;
switch (static_cast<Sound>(i))
{
case Sound::SOUND_ONE:
buf = RES_SOUND_ONE;
siz = sizeof (RES_SOUND_ONE);
break;
case Sound::SOUND_TWO:
buf = RES_SOUND_TWO;
siz = sizeof (RES_SOUND_TWO);
break;
case Sound::SOUND_THREE:
buf = RES_SOUND_THREE;
siz = sizeof (RES_SOUND_THREE);
break;
}
mySounds[static_cast<Sound>(i)].loadFromMemory(buf, siz);
}
- 使用 sf::Text 数组时崩溃
- 尝试将 sf::Texture* 推送到 std::vector 时出错
- 为什么 sf::Text 显示点而不是数字?
- sf::文本不显示?
- sf::Windows上的音乐:api-ms-win-crt-locale-l1-1-0.dll:无法打开共享对象文件
- 如何将sf::RenderWindow传递给另一个函数
- 当我尝试绘制 sf::Text 对象时,SFML 中的分段错误
- 重载运算符时出错<在 sf::Vector 中
- 声明 sf::SoundBuffer 会导致程序在终止时崩溃
- 正在加载 sf::图片来自 QDialog
- SFML 中的分段错误 调用 sf::窗口::关闭后
- 未解决的外部符号sf ::带有SFML的时间
- crtdbg 在使用 sf::Text::setOutlineThickness 时转储内存泄漏
- sf::声音函数会导致链接器错误
- SFML sf::Mouse::getPosition 方法无法编写正确的参数
- SF :: Renderwindow的destrutor被检测到的堆叠粉碎
- 为什么我的SFML将SF ::纹理作为参数传递到函数时会不断崩溃
- SFML/C++ 闪烁命中效果 sf::精灵
- SFML 2.4.2 在绘制 sf::Text 对象之前获取本地边界
- 创建指向未符号char []的指针,然后将其传递给SF :: Soundbuffer :: LoadFromememor