Почему моя кнопка не работает правильно? SDL2

#c #sdl-2 #audio-player

#c #sdl-2 #аудиоплеер

Вопрос:

Я пытаюсь сделать небольшую программу с SDL2 и C . В окне есть окно и кнопка. Я хочу сделать это, когда я нажимаю в первый раз, когда начинает воспроизводиться музыка кнопки. Да, я заставил это работать.

             if((mouseX >= buttonRect.x amp;amp; mouseX < (buttonRect.x   buttonRect.w)) amp;amp; (mouseY >= buttonRect.y amp;amp; mouseY < (buttonRect.y   buttonRect.h))){
                if(event.button.button == SDL_BUTTON(SDL_BUTTON_LEFT)){
                    if(Mix_PlayingMusic() == 0){
                        Mix_PlayMusic(music, -1);
                    }
                }
            }
  

Но я хочу сделать так, чтобы при повторном нажатии кнопки музыка приостанавливалась. И если она будет нажата снова, она возобновится.

Я попробовал это:

             if((mouseX >= buttonRect.x amp;amp; mouseX < (buttonRect.x   buttonRect.w)) amp;amp; (mouseY >= buttonRect.y amp;amp; mouseY < (buttonRect.y   buttonRect.h))){
                if(event.button.button == SDL_BUTTON(SDL_BUTTON_LEFT)){
                    if(Mix_PlayingMusic() == 0){
                        Mix_PlayMusic(music, -1);
                    }else{
                        if(Mix_PausedMusic() == 1){
                            Mix_ResumeMusic();
                        }else{
                            Mix_PauseMusic();
                        }
                    }
                }
            }
  

Но это не сработает. Когда я нажимаю кнопку, музыка запускается и мгновенно останавливается. Если я удерживаю нажатой кнопку мыши на кнопке, будет воспроизводиться музыка, но если я перемещаю мышь, она останавливается.

Ответ №1:

Mix_PlayMusic возвращает 0 при успешном завершении или -1 при ошибках. Попробуйте определить статическую переменную, чтобы следить за состоянием проигрывателя;

             if((mouseX >= buttonRect.x amp;amp; mouseX < (buttonRect.x   buttonRect.w)) amp;amp; (mouseY >= buttonRect.y amp;amp; mouseY < (buttonRect.y   buttonRect.h))){
                static int STATE = 0; // not played
                if(event.button.button == SDL_BUTTON(SDL_BUTTON_LEFT)){
                    if(STATE == 0){
                        Mix_PlayMusic(music, -1);
                        STATE = 1; // playing music
                    }else{
                        if(STATE == 2){
                            Mix_ResumeMusic();
                        } else {
                            Mix_PauseMusic();
                            STATE = 2; // paused
                        }
                    }
                }
            }