Cocos2d-X 简单音频引擎的音量设置有问题吗?

Problems to set volume of Cocos2d-X Simple Audio Engine?

我在 Marmalade SDK 7.8.0 上使用 Cocos2d-X 2.2.6 开发游戏,我在设置 Cocos Denshion 简单音频引擎的音效音量时遇到了一些问题。

我的代码是这样的:

void AudioHelper::init()
{
    s3eResult result;

    context = GameContext::getInstance();
    s3eSoundSetInt(S3E_SOUND_DEFAULT_FREQ, 44100);

    audioEngine = SimpleAudioEngine::sharedEngine();

    preloadSoundEffects();

    setVolume(context->getSoundVolume());
}

void AudioHelper::preloadSoundEffects()
{
    unsigned int i;
    CCArray *keysArray;
    CCString *key;
    const CCString *sound;

    keysArray = soundEffects->allKeys();

    for (i = 0; i < keysArray->count(); i++)
    {
        key = (CCString *) keysArray->objectAtIndex(i);
        sound = soundEffects->valueForKey(key->getCString());

        audioEngine->preloadEffect(sound->getCString());
    }
}

void AudioHelper::setVolume(int volumeLevel)
{
    float volume;

    // Note: there are 6 volume levels in my game, they go from 
    // 0 (max volume) to 5 (no sound).
    volume = 1 - volumeLevel / 5.0;

    audioEngine->setEffectsVolume(volume);
}

void AudioHelper::playSoundEffect(const char *effectKey)
{
    const CCString *sound;
    int volume;

    sound = soundEffects->valueForKey(effectKey);

    if (sound != NULL)
        audioEngine->playEffect(sound->getCString());

}

问题是当我调用setVolume方法时,音效音量没有改变,除非我将音量级别参数设置为5(没有声音)。发生这种情况时,不会播放任何声音(如预期的那样)。

我做错了什么?

s3eSound 设置音量时期望值介于 0-255 之间。

您可以通过调用追踪当前成交量:

s3eSoundGetInt(S3E_SOUND_VOLUME)

每次将音量设置为特定值并查看 S3E_SOUND_VOLUME 是否按预期变化。

我注意到你使用:

volume = 1 - volumeLevel / 5.0;

如果提供从 1 到 5 的输入值,这将导致 1 到 0 之间的值递减 0.20。

这些值要么设置错误,要么被简单音频引擎错误地转换为 s3eSound 值。

找出两者将使您更深入地了解可能出了什么问题。

您是否在此代码中记录了实际值?

void AudioHelper::setVolume(int volumeLevel)
{
    float volume;

    // Note: there are 6 volume levels in my game, they go from 
    // 0 (max volume) to 5 (no sound).
    volume = 1 - volumeLevel / 5.0;

    audioEngine->setEffectsVolume(volume);
}

您不能以这种方式混合浮点数和整数计算。 float volume 这里无论如何都是 1 或 0,因为您使用 volumeLevel 作为 int 类型。您的代码应如下所示:

void AudioHelper::setVolume(int volumeLevel)
{
    float volume;

    // Note: there are 6 volume levels in my game, they go from 
    // 0 (max volume) to 5 (no sound).
    volume = 1.0f - (float)volumeLevel / 5.0f;

    audioEngine->setEffectsVolume(volume);
}

还要考虑到在 win 平台上使用 CocosDenshion 有一些限制(那里没有音量变化)。