2016-05-21 8 views
2

Ich habe nur ein seltsames Problem. Ich suche nach Sounds in meinem Spiel. Es ist ein Spiel mit zwei Phasen. Einer von RPG und einer von Kampf. In RPG können Sie einen Kampf starten, wenn Sie auf einem Monster laufen. In meinem Code benutze ich 3 mal SDL_mixer um Musik zu spielen (im Menü und im RPG und im Kampf). Es funktioniert in den ersten beiden Fällen, aber wenn ich einen Kampf starte, gibt es keine Musik. Die Musik wird geladen, und Mix_playingMusic gibt true zurück, aber ich kann keine Musik hören, wenn ein Kampf gestartet wird. Ich benutze die gleiche Musik wie im RPG und Menü. Der Code über SDL_Mixer ist überall gleich. Teil des Codes des Kampfes:SDL_Mixer arbeitet nicht an einem Teil des Codes

{ 
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; 

}

EDIT: Ich habe ein printf("%s", Mix_GetError) hinzugefügt und es gibt keine Fehler im Menü und rpg aber im Kampf es war Druck: Ungültige Audiogerät ID

+0

Haben Sie es versucht mit der gleichen Musikdatei wie an den anderen Orten funktioniert es? –

+0

Ja ich benutze die gleiche Musik im Menü, RPG und Kampf –

Antwort

1

Also, Ich fand eine Lösung, um mein Problem zu lösen. Anscheinend ist der Rückgabewert von SDL_OpenAudio immer Erfolg oder Fehlschlag und keine Geräte-ID, was bedeutet, dass mit dieser Funktion immer nur ein Gerät geöffnet sein kann. Ich habe gerade den Ton geschlossen, bevor ich ihn beim Kampfstart wieder geöffnet habe, und es funktioniert.

Verwandte Themen