JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
music pauses when game pauses and ends when game ends
authorJason Woofenden <jason283@herkamire.com>
Sun, 26 Apr 2009 05:18:09 +0000 (01:18 -0400)
committerJason Woofenden <jason283@herkamire.com>
Sun, 26 Apr 2009 05:18:09 +0000 (01:18 -0400)
main.c
sound.c
sound.h

diff --git a/main.c b/main.c
index 358faf5..fe864bd 100644 (file)
--- a/main.c
+++ b/main.c
@@ -517,16 +517,19 @@ draw(void)
        show_score();
 
        switch (state) {
        show_score();
 
        switch (state) {
-               case GAME_OVER: draw_game_over(); break;
+               case GAME_OVER:
+                       draw_game_over();
+                       break;
 
 
-               case TITLE_PAGE: draw_title_page(); break;
+               case TITLE_PAGE:
+                       draw_title_page();
+                       break;
 
 
-               case HIGH_SCORE_ENTRY: play_tune(TUNE_HIGH_SCORE_ENTRY);
-                       // and fall through to
+               case HIGH_SCORE_ENTRY:
                case HIGH_SCORE_DISPLAY:
                case HIGH_SCORE_DISPLAY:
-                       // Display de list o high scores mon.
                        display_scores(150,50);
                        break;
                        display_scores(150,50);
                        break;
+
                case GAMEPLAY:
                case DEAD_PAUSE:
                        ; // no action necessary
                case GAMEPLAY:
                case DEAD_PAUSE:
                        ; // no action necessary
@@ -552,6 +555,7 @@ kill_ship(struct ship *ship)
                if(ship->dx < BARRIER_SPEED) ship->dx = BARRIER_SPEED;
        } else {
                state = GAME_OVER;
                if(ship->dx < BARRIER_SPEED) ship->dx = BARRIER_SPEED;
        } else {
                state = GAME_OVER;
+               play_tune(TUNE_TITLE_PAGE);
                state_timeout = 200.0;
                fadetimer = 0.0;
                ship->flags = 0;
                state_timeout = 200.0;
                fadetimer = 0.0;
                ship->flags = 0;
@@ -593,7 +597,6 @@ update_state(void)
                        // Restore the ship and continue playing
                        ship.flags = DRAW|MOVE|COLLIDE;
                        state = GAMEPLAY;
                        // Restore the ship and continue playing
                        ship.flags = DRAW|MOVE|COLLIDE;
                        state = GAMEPLAY;
-                       play_tune(TUNE_GAMEPLAY);
                        break;
                case GAME_OVER:
                        if(new_high_score(score)) init_score_entry();
                        break;
                case GAME_OVER:
                        if(new_high_score(score)) init_score_entry();
@@ -651,7 +654,6 @@ gameloop() {
                                                        // continue to display the scores briefly
                                                        state = HIGH_SCORE_DISPLAY;
                                                        state_timeout = 200;
                                                        // continue to display the scores briefly
                                                        state = HIGH_SCORE_DISPLAY;
                                                        state_timeout = 200;
-                                                       play_tune(TUNE_TITLE_PAGE);
                                                }
                                        } else {
                                                switch(e.key.keysym.sym) {
                                                }
                                        } else {
                                                switch(e.key.keysym.sym) {
@@ -665,7 +667,10 @@ gameloop() {
                                                        case SDLK_p:
                                                        case SDLK_PAUSE:
                                                                paused = !paused;
                                                        case SDLK_p:
                                                        case SDLK_PAUSE:
                                                                paused = !paused;
-                                                               if(!paused) {
+                                                               if(paused) {
+                                                                       pause_tune();
+                                                               } else {
+                                                                       resume_tune();
                                                                        ms_end = SDL_GetTicks();
                                                                }
                                                                break;
                                                                        ms_end = SDL_GetTicks();
                                                                }
                                                                break;
diff --git a/sound.c b/sound.c
index 6ddc496..471808e 100644 (file)
--- a/sound.c
+++ b/sound.c
@@ -74,18 +74,48 @@ int playing=-1;
 
 void
 play_tune(int i) {
 
 void
 play_tune(int i) {
-       if(!opt_sound) return;
-       if (playing==i)
-       return;
+       if(!opt_sound) {
+               return;
+       }
+       if (playing == i) {
+               return;
+       }
        if (playing) {
        if (playing) {
-               Mix_FadeOutMusic(1500);
+               Mix_FadeOutMusic(2500);
+       }
+       if(i == TUNE_GAMEPLAY) {
+               Mix_FadeInMusic(music[i],-1,2000);
+               Mix_VolumeMusic(music_volume[i]);
        }
        }
-       Mix_FadeInMusic(music[i],-1,2000);
-       Mix_VolumeMusic(music_volume[i]);
 
        playing = i;
 }
 
 
        playing = i;
 }
 
+
+int tune_paused=0;
+
+void
+pause_tune() {
+       if(!opt_sound) {
+               return;
+       }
+       if(playing == TUNE_GAMEPLAY && !tune_paused) {
+               Mix_PauseMusic();
+               tune_paused = 1;
+       }
+}
+
+void
+resume_tune() {
+       if(!opt_sound) {
+               return;
+       }
+       if(playing == TUNE_GAMEPLAY && tune_paused) {
+               Mix_ResumeMusic();
+               tune_paused = 0;
+       }
+}
+
 /*
  *
  * The init_sound() routine is called first.
 /*
  *
  * The init_sound() routine is called first.
diff --git a/sound.h b/sound.h
index 57cb6f1..8d5dcee 100644 (file)
--- a/sound.h
+++ b/sound.h
@@ -22,6 +22,8 @@
 int init_sound(void);
 void play_sound(int i);
 void play_tune(int i);
 int init_sound(void);
 void play_sound(int i);
 void play_tune(int i);
+void pause_tune();
+void resume_tune();
 
 #define TUNE_TITLE_PAGE                0
 #define TUNE_GAMEPLAY          1
 
 #define TUNE_TITLE_PAGE                0
 #define TUNE_GAMEPLAY          1