From 3996ccb4e2a0d81500d1b1370b2b97256d1ee465 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 12 Mar 2022 09:53:02 -0500 Subject: added transition and the world music --- src/muxer.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) (limited to 'src/muxer.cpp') diff --git a/src/muxer.cpp b/src/muxer.cpp index 5b09ef8..3450187 100644 --- a/src/muxer.cpp +++ b/src/muxer.cpp @@ -62,9 +62,65 @@ void Muxer::playSoundAtPosition(std::string name, float x, float y) { } void Muxer::setMusicLevel(int level) { - ERRCHECK(exploration_event_->setParameterByName("level", level)); + if (transition_state_ == TransitionState::Pre) { + if (level >= 3) { + transition_state_ = TransitionState::Transition; + ERRCHECK(exploration_event_->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT)); + ERRCHECK(exploration_event_->release()); + + FMOD::Studio::EventDescription* eventDescription = nullptr; + ERRCHECK(system_->getEvent("event:/transition", &eventDescription)); + ERRCHECK(eventDescription->createInstance(&transition_event_)); + ERRCHECK(transition_event_->start()); + } else { + ERRCHECK(exploration_event_->setParameterByName("level", level)); + } + } else if (transition_state_ == TransitionState::Post) { + if (level <= 3) { + ERRCHECK(the_world_event_->setParameterByName("level_full", 0)); + } else { + ERRCHECK(the_world_event_->setParameterByName("level_full", level - 3)); + } + } +} + +void Muxer::stopMusic() { + switch (transition_state_) { + case TransitionState::Pre: { + ERRCHECK(exploration_event_->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT)); + break; + } + case TransitionState::Transition: { + ERRCHECK(transition_event_->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT)); + break; + } + case TransitionState::Post: { + ERRCHECK(the_world_event_->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT)); + break; + } + case TransitionState::Stopped: { + // Do nothing. + break; + } + } + + transition_state_ = TransitionState::Stopped; } void Muxer::update() { + if (transition_state_ == TransitionState::Transition) { + FMOD_STUDIO_PLAYBACK_STATE playbackState; + ERRCHECK(transition_event_->getPlaybackState(&playbackState)); + if (playbackState == FMOD_STUDIO_PLAYBACK_STOPPED) { + transition_state_ = TransitionState::Post; + transition_event_->release(); + + FMOD::Studio::EventDescription* eventDescription = nullptr; + ERRCHECK(system_->getEvent("event:/the_world", &eventDescription)); + ERRCHECK(eventDescription->createInstance(&the_world_event_)); + ERRCHECK(the_world_event_->start()); + } + } + ERRCHECK(system_->update()); } -- cgit 1.4.1