【问题标题】:Problems to set volume of Cocos2d-X Simple Audio Engine?Cocos2d-X Simple Audio Engine 音量设置问题?
【发布时间】:2015-09-03 14:25:27
【问题描述】:

我在 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(无声音)。发生这种情况时,不会播放任何声音(如预期的那样)。

我做错了什么?

【问题讨论】:

    标签: android ios audio cocos2d-x marmalade


    【解决方案1】:

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

    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 有一些限制(那里没有音量变化)。

    【讨论】:

    • 是的,我确实记录了我为音量变量获取的值,它们是浮点值,所以这部分工作正常。由于 5.0 确定了浮点类型,因此我在音量变量上得到的结果也是浮点数。这将是一个问题,但是如果我的代码是这样的:`volume = 1 - volumeLevel / 5;` 那么结果将始终是 int 并且音量将是 1 或 0。
    • 我重新测试了我的游戏,但这次是在实际设备而不是Windows模拟器上,现在setVolume函数工作了(代码与上面相同),所以我认为问题是您提到的 CocosDenshion 限制。我无法在 Windows 中更改音量,但我可以在设备中进行。谢谢您的帮助! :)
    【解决方案2】:

    s3eSound 在设置音量时需要介于 0-255 之间的值。

    您可以通过调用来跟踪当前音量:

    s3eSoundGetInt(S3E_SOUND_VOLUME)
    

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

    我注意到你使用:

    volume = 1 - volumeLevel / 5.0;
    

    如果提供从 1 到 5 的输入值,这会产生一个介于 1 和 0 之间的值,递减 0.20。

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

    追踪这两者会让您更深入地了解可能出现的问题。

    【讨论】:

    • 您好,我已经检查了您提到的s3eSoundGetInt(S3E_SOUND_VOLUME) 并且audioEngine-&gt;setEffectsVolume(volume); 命令确实有效。它正在增加和减少此属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多