제 게임에서 나는 사운드 리소스 홀더로 사용하는 std::map<Sound, sf::SoundBuffer> mySounds
맵을 가지고 있습니다. 나는 현재 sf::SoundBuffer::loadFromFile
를 사용하여 사운드를로드하기 위해 지금서명되지 않은 char []에 대한 포인터를 생성하여 sf :: SoundBuffer :: loadFromMemory에 전달하십시오.
enum class Sound {
SOUND_ONE,
SOUND_TWO,
SOUND_THREE,
NUMBER_OF_SOUNDS
};
, 그리고 코드는 다음과 같습니다 :
Sound
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));
하고 완벽하게 작동합니다.
나는 하나 이상의 소리를 가지고 있으므로 for-loop (처음에는 널 포인터) 안에 포인터가있을 것을 생각하고 있었다.
그렇다면 현재 루프 인덱스를 기반으로 적절한 바이트 배열에 포인터를 설정해야합니다 (아래 코드 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)
이 함수에 널 포인터를 전달 하시겠습니까? 하나의 처리 된 가치가 있습니다 (NUMBER_OF_SOUNDS) –