2016-05-21 21 views
2

私はちょっと変わった問題があります。私は私のゲームに音を入れようとしています。それは2段階のゲームです。 RPGの1つと戦いの1つ。 rpgでは、あなたがモンスターを歩いているときに戦闘を開始することができます。私のコードでは、3回SDL_mixerを使用して音楽を再生します(メニューとRPGとの戦い)。最初の2つのケースで動作しますが、私が戦いを始めるときには音楽はありません。音楽が読み込まれ、Mix_playingMusicがtrueを返しますが、試合が開始されたときに音楽が聞こえません。私はRPGとメニューと同じ音楽を使用しています。 SDL_Mixerに関するコードはどこでも同じです。戦いのコードの パート:コードの一部で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

+0

他の場所と同じ音楽ファイルを使用して試しましたか? –

+0

はい、私はメニュー、RPG、戦いで同じ音楽を使用します –

答えて

1

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

関連する問題