张银峰的编程课堂

播放声音

音效模块的实现

音效会让游戏的交互性增色不少,我们先定义几个常量用于索引要播放的音效。

#define SOUND_MOVE      1
#define SOUND_PUSH      2
#define SOUND_WRONG     3
#define SOUND_WIN       4
#define SOUND_CLICK     5

音效是一种资源,音效的初始化,就是资源的载入。

我们使用g_audio_list存储预定的5种音效,这里的设计技巧是g_audio_list[0]不使用,这样播放一处声音时就不需要作减一运算了。

#define AUDIO_COUNT 6

static int g_audio_list[AUDIO_COUNT];

//=======================================================================================
int Audio_Init()
{
    g_audio_list[SOUND_MOVE] = E2D_LoadAudio("./res/audio/move.mp3", E2D_SOUND);
    g_audio_list[SOUND_PUSH] = E2D_LoadAudio("./res/audio/push.mp3", E2D_SOUND);
    g_audio_list[SOUND_WRONG] = E2D_LoadAudio("./res/audio/wrong.wav", E2D_SOUND);
    g_audio_list[SOUND_WIN] = E2D_LoadAudio("./res/audio/win.mp3", E2D_SOUND);
    g_audio_list[SOUND_CLICK] = E2D_LoadAudio("./res/audio/click.ogg", E2D_SOUND);
    return 1;
}

基于Easy2D播放音效非常简单,这里我们提供Audio_Play作为与其它模块的交互。

void Audio_Play(int id)
{
    if (id >= SOUND_MOVE && id < AUDIO_COUNT)
    {
        E2D_PlayAudio(id, 0, 0);
    }
}

与其它模块的交互

一切就绪后,我们只需要在玩家触发相应的动作时,播放相应的音效即可;如向前移动却碰到障碍时播放出错音效。

if (g_map[p1.r][p1.c] == WALL)
{
    Audio_Play(SOUND_WRONG);
    return;
}

现有的实现在通关时,会立即加载下一关地图,显示非常突兀,但加入音效时,会增加一点过渡感,让我们更加清晰的感知到过关了这一事实。

if (Is_Level_Clear())
{
    Audio_Play(SOUND_WIN);
    Game_Load_Level(g_cur_level + 1);
}