3

私はちょうど奇妙な問題を抱えています。ゲームに音を入れたいと思っています。2段階のゲームです。RPG の 1 つと戦いの 1 つ。RPGでは、モンスターの上を歩くと戦闘を開始できます。私のコードでは、SDL_mixer を 3 回使用して音楽を再生します (メニューと RPG と戦闘で)。最初の 2 つのケースでは機能しますが、戦闘を開始すると音楽が流れません。音楽が読み込まれ、Mix_playingMusic が true を返しますが、戦闘が開始されたときに音楽が聞こえません。RPGやメニューと同じ音楽を使用しています。SDL_Mixer に関するコードはどこでも同じです。戦いのコードの一部:

{
SDL_Event events;
Mix_Music *fightMusic;

enum actual_player actual = PLAYER;
int go = 1;
int action;
int monsterId = 0;

Uint32  t = SDL_GetTicks(), nt;

fightMusic = Mix_LoadMUS("data/Music/rpg.mp3"); // we loading the music

if(fightMusic == NULL){
    printf("error loading fightMusic\n");
}

Mix_VolumeMusic(MIX_MAX_VOLUME);

if(Mix_PlayMusic(fightMusic, -1)<0){
    printf("error playing fightMusic \n");
}
if (Mix_PlayingMusic() ){
    printf("Music it's playing \n");
}

while(go){
    if(isFinished(fightSdl->fight))
        go = 0;
    nt = SDL_GetTicks();


    while (SDL_PollEvent(&events)){

        action = inputKeyboard(events);
        if(action == QUIT){
            return -1;
            go = 0;
        }

        if(action == -2){
            clearBufferGame(fightSdl->buffer, CHARACTER);
        }

        if(actual == PLAYER) {

            switch(action){

                case MOVE_DOWNWARD:                 
                    addActionToBufferGame(fightSdl->buffer, DOWN);
                break;

                case MOVE_UPWARD:
                    addActionToBufferGame(fightSdl->buffer, UP);
                break;

                case MOVE_LEFT:
                    addActionToBufferGame(fightSdl->buffer, LEFT);
                break;

                case MOVE_RIGHT:
                    addActionToBufferGame(fightSdl->buffer, RIGHT);

                break;

                case ATTACK_1:
                    actionAttackSdl(fightSdl, ATTACK_1);
                break;

                case ATTACK_2:
                    if(Mix_PlayChannel(-1,fireSound,0)<0){
                            printf("error playing fire sound");
                        }
                    actionAttackSdl(fightSdl, ATTACK_2);
                break;

                case ATTACK_3:
                    actionAttackSdl(fightSdl, ATTACK_3);
                break;

                case NOTHING:
                    actual = ENNEMY;
                break;

                case -1:
                    setIsIdleCharacSdl(fightSdl->characSdl,1);
            }   
        }           
    }
    if (nt-t>300){

        if(actual == ENNEMY){
            hitNRunSdl(fightSdl, monsterId);

            if(getMpEnnemyFight(fightSdl->fight) == 3 && getMpEnnemyFight(fightSdl->fight) == 3)
                monsterId++;
            if(monsterId >= fightSdl->nbMstrSdl){
                actual = PLAYER;
                setApPlayerFight(fightSdl->fight, 3);
                setMpPlayerFight(fightSdl->fight, 3);
                monsterId = 0;
            }

        }
        t = nt;
    }


    // updatePlayerDisplay(fightSdl);
    // updateMonsterDisplay(fightSdl);
    updatePlayerActionFight(fightSdl);
    updateSpellDisplay(fightSdl);
    updateDisplay(fightSdl);

    drawGame(fightSdl);

    // SDL_RenderPresent(fightSdl->renderer);
}

if(getLifePointsCharacter(getCharacterFight(fightSdl->fight)) >= 0)
    return 1;
return 0;

}

編集:追加しましたprintf("%s", Mix_GetError)が、メニューとRPGにエラーはありませんが、戦いでは印刷されました:無効なオーディオデバイスID

4

1 に答える 1

1

だから、私は私の問題を解決する解決策を見つけました。どうやら SDL_OpenAudio の戻り値は常に成功または失敗であり、デバイス ID ではありません。つまり、この関数で一度に 1 つのデバイスしか開くことができないということです。戦闘を開始するときに再度開く前にオーディオを閉じただけで、動作します。

于 2016-05-21T11:46:46.203 に答える