From 3bc84ca4bbae2aa6851e4725e4628de51d0eec93 Mon Sep 17 00:00:00 2001 From: t3kt Date: Fri, 26 Dec 2014 12:54:36 -0500 Subject: [PATCH 1/4] stubbing out the audio triggers --- bleepout.xcodeproj/project.pbxproj | 6 +++++ src/core/AudioManager.cpp | 35 ++++++++++++++++++++++++++++++ src/core/AudioManager.h | 32 +++++++++++++++++++++++++++ src/core/BleepoutApp.cpp | 8 +++++-- src/core/BleepoutApp.h | 2 ++ src/core/RoundManager.h | 2 ++ 6 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 src/core/AudioManager.cpp create mode 100644 src/core/AudioManager.h diff --git a/bleepout.xcodeproj/project.pbxproj b/bleepout.xcodeproj/project.pbxproj index 3df1287..ff1a546 100644 --- a/bleepout.xcodeproj/project.pbxproj +++ b/bleepout.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 3205CA361A412FDC0030EE68 /* SetupController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3205CA341A412FDC0030EE68 /* SetupController.cpp */; }; 32269B7B1A4A861400EF6DE4 /* RoundComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32269B791A4A861400EF6DE4 /* RoundComponent.cpp */; }; 32269B9B1A4CA55A00EF6DE4 /* PlayerController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32269B991A4CA55A00EF6DE4 /* PlayerController.cpp */; }; + 32269BA11A4DD18200EF6DE4 /* AudioManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32269B9F1A4DD18200EF6DE4 /* AudioManager.cpp */; }; 322D59D91A454BCF00150050 /* RendererUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 322D59D71A454BCF00150050 /* RendererUtil.cpp */; }; 325750E61A4792A500CC375A /* Round1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 325750E51A4792A500CC375A /* Round1.cpp */; }; 325750E91A4792E200CC375A /* Round2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 325750E81A4792E200CC375A /* Round2.cpp */; }; @@ -189,6 +190,8 @@ 32269B7A1A4A861400EF6DE4 /* RoundComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoundComponent.h; sourceTree = ""; }; 32269B991A4CA55A00EF6DE4 /* PlayerController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlayerController.cpp; sourceTree = ""; }; 32269B9A1A4CA55A00EF6DE4 /* PlayerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerController.h; sourceTree = ""; }; + 32269B9F1A4DD18200EF6DE4 /* AudioManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioManager.cpp; sourceTree = ""; }; + 32269BA01A4DD18200EF6DE4 /* AudioManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioManager.h; sourceTree = ""; }; 322D59D71A454BCF00150050 /* RendererUtil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RendererUtil.cpp; sourceTree = ""; }; 322D59D81A454BCF00150050 /* RendererUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RendererUtil.h; sourceTree = ""; }; 325750E51A4792A500CC375A /* Round1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Round1.cpp; sourceTree = ""; }; @@ -922,6 +925,8 @@ 325751901A48F83B00CC375A /* AdminController.h */, 32269B791A4A861400EF6DE4 /* RoundComponent.cpp */, 32269B7A1A4A861400EF6DE4 /* RoundComponent.h */, + 32269B9F1A4DD18200EF6DE4 /* AudioManager.cpp */, + 32269BA01A4DD18200EF6DE4 /* AudioManager.h */, ); path = core; sourceTree = ""; @@ -1284,6 +1289,7 @@ 5BB4E5F61A400F500047F957 /* PhysicsWorld.cpp in Sources */, 5B0E83491A369EC30091AB99 /* ofxBulletCustomShape.cpp in Sources */, 5B0DD9091A3C497600E8BBD1 /* ofxSyphonClient.mm in Sources */, + 32269BA11A4DD18200EF6DE4 /* AudioManager.cpp in Sources */, 5BB4E5EE1A400F500047F957 /* GameObject.cpp in Sources */, 325751791A48F63C00CC375A /* ofxUIScrollableCanvas.cpp in Sources */, 5BB4E5F71A400F500047F957 /* Animations.cpp in Sources */, diff --git a/src/core/AudioManager.cpp b/src/core/AudioManager.cpp new file mode 100644 index 0000000..30614ba --- /dev/null +++ b/src/core/AudioManager.cpp @@ -0,0 +1,35 @@ +// +// AudioManager.cpp +// bleepout +// +// Created by tekt on 12/26/14. +// +// + +#include "AudioManager.h" +#include "GameEvents.h" +#include "RoundManager.h" +#include "BleepoutParameters.h" + +AudioManager::AudioManager(const BleepoutParameters& appParams) +: _appParams(appParams) { } + +void AudioManager::setup() { + //... +} + +void AudioManager::update() { + //... +} + +void AudioManager::attachTo(RoundController &roundController) { + ofAddListener(roundController.logicController().brickDestroyedEvent, this, &AudioManager::onBrickDestroyed); +} + +void AudioManager::detachFrom(RoundController &roundController) { + ofRemoveListener(roundController.logicController().brickDestroyedEvent, this, &AudioManager::onBrickDestroyed); +} + +void AudioManager::onBrickDestroyed(BrickDestroyedEventArgs &e) { + _brickDestroyedSound.play(); +} diff --git a/src/core/AudioManager.h b/src/core/AudioManager.h new file mode 100644 index 0000000..4306661 --- /dev/null +++ b/src/core/AudioManager.h @@ -0,0 +1,32 @@ +// +// AudioManager.h +// bleepout +// +// Created by tekt on 12/26/14. +// +// + +#ifndef __bleepout__AudioManager__ +#define __bleepout__AudioManager__ + +#include + +class RoundController; +class BrickDestroyedEventArgs; +class BleepoutParameters; + +class AudioManager { +public: + AudioManager(const BleepoutParameters& appParams); + void setup(); + void update(); + void attachTo(RoundController& roundController); + void detachFrom(RoundController& roundController); +private: + void onBrickDestroyed(BrickDestroyedEventArgs& e); + + ofSoundPlayer _brickDestroyedSound; + const BleepoutParameters& _appParams; +}; + +#endif /* defined(__bleepout__AudioManager__) */ diff --git a/src/core/BleepoutApp.cpp b/src/core/BleepoutApp.cpp index 84934c4..5269008 100644 --- a/src/core/BleepoutApp.cpp +++ b/src/core/BleepoutApp.cpp @@ -32,6 +32,9 @@ void BleepoutApp::setup() { _adminController->attachTo(*this); ofAddListener(_adminController->tryStartRoundEvent, this, &BleepoutApp::onTryStartRound); ofAddListener(_adminController->tryEndRoundEvent, this, &BleepoutApp::onTryEndRound); + + _audioManager.reset(new AudioManager(*_appParams)); + _audioManager->setup(); _playerController.reset(new PlayerController()); @@ -61,6 +64,7 @@ void BleepoutApp::update() { _syphonEnabled = _appParams->enableSyphon; #endif _adminController->update(); + _audioManager->update(); if (_roundController) { _roundController->update(); } else if (_setupController) { @@ -91,8 +95,6 @@ void BleepoutApp::onTryStartRound(StartRoundEventArgs &e) { return; } if (_roundController) { - ofRemoveListener(_roundController->tryEndRoundEvent, this, - &BleepoutApp::onTryEndRound); ofLogError() << "Round has already been started"; return; } @@ -107,6 +109,7 @@ void BleepoutApp::onTryStartRound(StartRoundEventArgs &e) { &BleepoutApp::onTryEndRound); ofAddListener(_roundController->roundQueueEvent, _playerController.get(), &PlayerController::onRoundQueue); + _audioManager->attachTo(*_roundController); e.markHandled(); notifyRoundStarted(_roundController->state()); } @@ -122,6 +125,7 @@ void BleepoutApp::onTryEndRound(EndRoundEventArgs &e) { void BleepoutApp::endRound() { _playerManager->setIsInRound(false); + _audioManager->detachFrom(*_roundController); _roundController.reset(); _endingRound = true; notifyRoundEnded(); diff --git a/src/core/BleepoutApp.h b/src/core/BleepoutApp.h index e189c39..8a5ced0 100644 --- a/src/core/BleepoutApp.h +++ b/src/core/BleepoutApp.h @@ -20,6 +20,7 @@ #include "SetupController.h" #include "GameEvents.h" #include "AdminController.h" +#include "AudioManager.h" #ifdef ENABLE_SYPHON #include @@ -60,6 +61,7 @@ class BleepoutApp : public ofBaseApp, public EventSource { ofPtr _setupController; ofPtr _roundController; ofPtr _adminController; + ofPtr _audioManager; #ifdef ENABLE_SYPHON ofxSyphonClient _syphonClient; #endif // ENABLE_SYPHON diff --git a/src/core/RoundManager.h b/src/core/RoundManager.h index 22b3bfd..6a91bed 100644 --- a/src/core/RoundManager.h +++ b/src/core/RoundManager.h @@ -62,6 +62,8 @@ class RoundController : public EventSource void addTimedAction(ofPtr action); const char* eventSourceName() const override { return "RoundController"; } + + LogicController& logicController() { return *_logicController; } private: void onPlayerYawPitchRoll(PlayerYawPitchRollEventArgs& e); From 907d9d11f70fc398b4b75a30b04af1ae45dd2fb1 Mon Sep 17 00:00:00 2001 From: t3kt Date: Fri, 26 Dec 2014 13:29:23 -0500 Subject: [PATCH 2/4] stubbed out more sound effects (see #41) --- src/config/BleepoutConfig.cpp | 12 +++++ src/config/BleepoutConfig.h | 11 ++++ src/core/AudioManager.cpp | 96 +++++++++++++++++++++++++++++++++-- src/core/AudioManager.h | 27 ++++++++-- src/core/BleepoutApp.cpp | 1 + src/core/RoundManager.h | 1 + 6 files changed, 142 insertions(+), 6 deletions(-) diff --git a/src/config/BleepoutConfig.cpp b/src/config/BleepoutConfig.cpp index 13e943c..6a52f89 100644 --- a/src/config/BleepoutConfig.cpp +++ b/src/config/BleepoutConfig.cpp @@ -27,6 +27,18 @@ BleepoutConfig* BleepoutConfig::createConfig() { BleepoutConfig* config = new BleepoutConfig(); config->_syphonServerName = "Composition"; config->_syphonAppName = "Arena"; + + config->roundStartedSound = ""; + config->roundEndedSound = ""; + config->brickDestroyedSound = ""; + config->collisionSound = ""; + config->modifierAppliedSound = ""; + config->modifierRemovedSound = ""; + config->ballDestroyedSound = ""; + config->playerLivesChangedSound = ""; + config->playerLostSound = ""; + config->countdownTimerTickSound = ""; + config->_roundConfigs.push_back(ofPtr(RoundConfig::createRoundConfig1())); config->_roundConfigs.push_back(ofPtr(RoundConfig::createRoundConfig2())); config->_roundConfigs.push_back(ofPtr(RoundConfig::createRoundConfig3())); diff --git a/src/config/BleepoutConfig.h b/src/config/BleepoutConfig.h index 5a37959..98e9e97 100644 --- a/src/config/BleepoutConfig.h +++ b/src/config/BleepoutConfig.h @@ -193,6 +193,17 @@ class BleepoutConfig { ofPtr getRound(const std::string& name); + std::string roundStartedSound; + std::string roundEndedSound; + std::string brickDestroyedSound; + std::string collisionSound; + std::string modifierAppliedSound; + std::string modifierRemovedSound; + std::string ballDestroyedSound; + std::string playerLivesChangedSound; + std::string playerLostSound; + std::string countdownTimerTickSound; + Json::Value toJsonVal() const; private: int _fps; diff --git a/src/core/AudioManager.cpp b/src/core/AudioManager.cpp index 30614ba..61ae05c 100644 --- a/src/core/AudioManager.cpp +++ b/src/core/AudioManager.cpp @@ -9,27 +9,117 @@ #include "AudioManager.h" #include "GameEvents.h" #include "RoundManager.h" +#include "BleepoutApp.h" #include "BleepoutParameters.h" AudioManager::AudioManager(const BleepoutParameters& appParams) : _appParams(appParams) { } + +static inline void loadSoundSafe(ofSoundPlayer& sound, + const std::string& file) { + if (!file.empty()) + sound.loadSound(file); +} + void AudioManager::setup() { - //... + const BleepoutConfig& config = _appParams.appConfig(); + loadSoundSafe(_roundStartedSound, config.roundStartedSound); + loadSoundSafe(_roundEndedSound, config.roundEndedSound); + loadSoundSafe(_brickDestroyedSound, config.brickDestroyedSound); + loadSoundSafe(_collisionSound, config.collisionSound); + loadSoundSafe(_modifierAppliedSound, config.modifierAppliedSound); + loadSoundSafe(_modifierRemovedSound, config.modifierRemovedSound); + loadSoundSafe(_ballDestroyedSound, config.ballDestroyedSound); + loadSoundSafe(_playerLivesChangedSound, config.playerLivesChangedSound); + loadSoundSafe(_playerLostSound, config.playerLostSound); + loadSoundSafe(_countdownTimerTickSound, config.countdownTimerTickSound); } void AudioManager::update() { //... } +void AudioManager::attachTo(BleepoutApp &app) { + ofAddListener(app.roundStartedEvent, + this, &AudioManager::onRoundStarted); + ofAddListener(app.roundEndedEvent, + this, &AudioManager::onRoundEnded); +} + +void AudioManager::detachFrom(BleepoutApp &app) { + ofRemoveListener(app.roundStartedEvent, + this, &AudioManager::onRoundStarted); + ofRemoveListener(app.roundEndedEvent, + this, &AudioManager::onRoundEnded); +} + void AudioManager::attachTo(RoundController &roundController) { - ofAddListener(roundController.logicController().brickDestroyedEvent, this, &AudioManager::onBrickDestroyed); + ofAddListener(roundController.logicController().brickDestroyedEvent, + this, &AudioManager::onBrickDestroyed); + ofAddListener(roundController.spaceController().collisionEvent, + this, &AudioManager::onCollision); + ofAddListener(roundController.logicController().modifierAppliedEvent, + this, &AudioManager::onModifierApplied); + ofAddListener(roundController.logicController().modifierRemovedEvent, + this, &AudioManager::onModifierRemoved); + ofAddListener(roundController.logicController().ballDestroyedEvent, + this, &AudioManager::onBallDestroyed); + ofAddListener(roundController.logicController().playerLivesChangedEvent, + this, &AudioManager::onPlayerLivesChanged); + ofAddListener(roundController.logicController().playerLostEvent, + this, &AudioManager::onPlayerLost); } void AudioManager::detachFrom(RoundController &roundController) { - ofRemoveListener(roundController.logicController().brickDestroyedEvent, this, &AudioManager::onBrickDestroyed); + ofRemoveListener(roundController.logicController().brickDestroyedEvent, + this, &AudioManager::onBrickDestroyed); + ofRemoveListener(roundController.spaceController().collisionEvent, + this, &AudioManager::onCollision); + ofRemoveListener(roundController.logicController().modifierAppliedEvent, + this, &AudioManager::onModifierApplied); + ofRemoveListener(roundController.logicController().modifierRemovedEvent, + this, &AudioManager::onModifierRemoved); + ofRemoveListener(roundController.logicController().ballDestroyedEvent, + this, &AudioManager::onBallDestroyed); + ofRemoveListener(roundController.logicController().playerLivesChangedEvent, + this, &AudioManager::onPlayerLivesChanged); + ofRemoveListener(roundController.logicController().playerLostEvent, + this, &AudioManager::onPlayerLost); +} + +void AudioManager::onRoundStarted(RoundStateEventArgs &e) { + _roundStartedSound.play(); +} + +void AudioManager::onRoundEnded(EmptyEventArgs &e) { + _roundEndedSound.play(); } void AudioManager::onBrickDestroyed(BrickDestroyedEventArgs &e) { _brickDestroyedSound.play(); } + +void AudioManager::onCollision(CollisionEventArgs &e) { + _collisionSound.play(); +} + +void AudioManager::onModifierApplied(ModifierEventArgs &e) { + _modifierAppliedSound.play(); +} + +void AudioManager::onModifierRemoved(ModifierRemovedEventArgs &e) { + _modifierRemovedSound.play(); +} + +void AudioManager::onBallDestroyed(BallStateEventArgs &e) { + _ballDestroyedSound.play(); +} + +void AudioManager::onPlayerLivesChanged(PlayerStateEventArgs &e) { + _playerLivesChangedSound.play(); +} + +void AudioManager::onPlayerLost(PlayerStateEventArgs &e) { + _playerLostSound.play(); +} diff --git a/src/core/AudioManager.h b/src/core/AudioManager.h index 4306661..86b4524 100644 --- a/src/core/AudioManager.h +++ b/src/core/AudioManager.h @@ -10,23 +10,44 @@ #define __bleepout__AudioManager__ #include +#include "GameEvents.h" -class RoundController; -class BrickDestroyedEventArgs; class BleepoutParameters; +class BleepoutApp; +class RoundController; class AudioManager { public: AudioManager(const BleepoutParameters& appParams); void setup(); void update(); + void attachTo(BleepoutApp& app); + void detachFrom(BleepoutApp& app); void attachTo(RoundController& roundController); void detachFrom(RoundController& roundController); private: + void onRoundStarted(RoundStateEventArgs& e); + void onRoundEnded(EmptyEventArgs& e); void onBrickDestroyed(BrickDestroyedEventArgs& e); + void onCollision(CollisionEventArgs& e); + void onModifierApplied(ModifierEventArgs& e); + void onModifierRemoved(ModifierRemovedEventArgs& e); + void onBallDestroyed(BallStateEventArgs& e); + void onPlayerLivesChanged(PlayerStateEventArgs& e); + void onPlayerLost(PlayerStateEventArgs& e); +// void onCountdownTimerT - ofSoundPlayer _brickDestroyedSound; const BleepoutParameters& _appParams; + ofSoundPlayer _roundStartedSound; + ofSoundPlayer _roundEndedSound; + ofSoundPlayer _brickDestroyedSound; + ofSoundPlayer _collisionSound; + ofSoundPlayer _modifierAppliedSound; + ofSoundPlayer _modifierRemovedSound; + ofSoundPlayer _ballDestroyedSound; + ofSoundPlayer _playerLivesChangedSound; + ofSoundPlayer _playerLostSound; + ofSoundPlayer _countdownTimerTickSound; }; #endif /* defined(__bleepout__AudioManager__) */ diff --git a/src/core/BleepoutApp.cpp b/src/core/BleepoutApp.cpp index 5269008..2ac5038 100644 --- a/src/core/BleepoutApp.cpp +++ b/src/core/BleepoutApp.cpp @@ -35,6 +35,7 @@ void BleepoutApp::setup() { _audioManager.reset(new AudioManager(*_appParams)); _audioManager->setup(); + _audioManager->attachTo(*this); _playerController.reset(new PlayerController()); diff --git a/src/core/RoundManager.h b/src/core/RoundManager.h index 8e510bd..72c85c1 100644 --- a/src/core/RoundManager.h +++ b/src/core/RoundManager.h @@ -64,6 +64,7 @@ class RoundController : public EventSource const char* eventSourceName() const override { return "RoundController"; } LogicController& logicController() { return *_logicController; } + SpaceController& spaceController() { return *_spaceController; } private: void onPlayerYawPitchRoll(PlayerYawPitchRollEventArgs& e); From 2f61fd3a4a6fccfed6bf6ca79c6cac587c2e3f4e Mon Sep 17 00:00:00 2001 From: t3kt Date: Fri, 26 Dec 2014 13:39:30 -0500 Subject: [PATCH 3/4] added audio volume control see (#41, #21) --- src/config/BleepoutParameters.cpp | 3 ++- src/config/BleepoutParameters.h | 1 + src/core/AdminController.cpp | 2 ++ src/core/AudioManager.cpp | 12 +++++++++++- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/config/BleepoutParameters.cpp b/src/config/BleepoutParameters.cpp index e207d22..cff5c04 100644 --- a/src/config/BleepoutParameters.cpp +++ b/src/config/BleepoutParameters.cpp @@ -21,7 +21,8 @@ BleepoutParameters::BleepoutParameters(BleepoutConfig& appConfig) , ballsToAdd(0) , enableSyphon(true) , syphonAppName(appConfig.syphonAppName()) -, syphonServerName(appConfig.syphonServerName()) { +, syphonServerName(appConfig.syphonServerName()) +, audioVolume(.5) { for (const auto& round : _appConfig.roundConfigs()) { _queuedRoundNames.push_back(round->name()); } diff --git a/src/config/BleepoutParameters.h b/src/config/BleepoutParameters.h index f72c350..3d611fe 100644 --- a/src/config/BleepoutParameters.h +++ b/src/config/BleepoutParameters.h @@ -44,6 +44,7 @@ class BleepoutParameters { bool enableSyphon; std::string syphonAppName; std::string syphonServerName; + float audioVolume; private: ofParameterGroup _params; BleepoutConfig& _appConfig; diff --git a/src/core/AdminController.cpp b/src/core/AdminController.cpp index 1342e77..ecc8c3d 100644 --- a/src/core/AdminController.cpp +++ b/src/core/AdminController.cpp @@ -74,6 +74,7 @@ struct AdminUIControls { ofxUIButton* startRound; ofxUIButton* endRound; ofxUILabel* remainingTime; + ofxUISlider* audioVolume; ~AdminUIControls() { for (auto& slot : roundQueueSlots) @@ -163,6 +164,7 @@ void AdminController::setup() { _controls->syphonAppName->setTriggerType(OFX_UI_TEXTINPUT_ON_UNFOCUS); _controls->syphonServerName = _gui->addTextInput("Syphon Server", _appParams.syphonServerName); _controls->syphonServerName->setTriggerType(OFX_UI_TEXTINPUT_ON_UNFOCUS); + _controls->audioVolume = _gui->addSlider("Audio Volume", 0, 1, &_appParams.audioVolume); ofAddListener(_gui->newGUIEvent, this, &AdminController::onUIEvent); diff --git a/src/core/AudioManager.cpp b/src/core/AudioManager.cpp index 61ae05c..5f7e6f1 100644 --- a/src/core/AudioManager.cpp +++ b/src/core/AudioManager.cpp @@ -37,7 +37,17 @@ void AudioManager::setup() { } void AudioManager::update() { - //... + _roundStartedSound.setVolume(_appParams.audioVolume); + _roundEndedSound.setVolume(_appParams.audioVolume); + _brickDestroyedSound.setVolume(_appParams.audioVolume); + _collisionSound.setVolume(_appParams.audioVolume); + _modifierAppliedSound.setVolume(_appParams.audioVolume); + _modifierRemovedSound.setVolume(_appParams.audioVolume); + _ballDestroyedSound.setVolume(_appParams.audioVolume); + _brickDestroyedSound.setVolume(_appParams.audioVolume); + _playerLivesChangedSound.setVolume(_appParams.audioVolume); + _playerLostSound.setVolume(_appParams.audioVolume); + _countdownTimerTickSound.setVolume(_appParams.audioVolume); } void AudioManager::attachTo(BleepoutApp &app) { From 73516ff780022beb73f12d59a0a0db6f91b84868 Mon Sep 17 00:00:00 2001 From: t3kt Date: Fri, 26 Dec 2014 14:30:46 -0500 Subject: [PATCH 4/4] added countdown timer tick event --- src/config/BleepoutConfig.cpp | 3 ++- src/config/BleepoutConfig.h | 2 ++ src/core/AudioManager.cpp | 8 ++++++++ src/core/AudioManager.h | 2 +- src/core/BleepoutApp.cpp | 2 +- src/core/GameEvents.cpp | 7 +++++++ src/core/GameEvents.h | 12 ++++++++++++ src/core/LogicController.cpp | 18 ++++++++++++++---- src/core/LogicController.h | 4 ++++ src/core/RoundManager.h | 1 + src/rendering/Animations.cpp | 13 ++++++++++++- src/rendering/Animations.h | 1 + 12 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/config/BleepoutConfig.cpp b/src/config/BleepoutConfig.cpp index 6a52f89..a73d2b6 100644 --- a/src/config/BleepoutConfig.cpp +++ b/src/config/BleepoutConfig.cpp @@ -80,7 +80,8 @@ _modifierFadeTime(0.2f), _domeRadius(150.0f), _domeMargin(20.0f), _name(name), -_startDelay(0) { } +_startDelay(0), +countdownTimerPeriod(10) { } void RoundConfig::loadJsonFile(std::string path) { Json::Value obj; diff --git a/src/config/BleepoutConfig.h b/src/config/BleepoutConfig.h index 98e9e97..125f405 100644 --- a/src/config/BleepoutConfig.h +++ b/src/config/BleepoutConfig.h @@ -147,6 +147,8 @@ class RoundConfig { const GameRules& rules() const { return _rules; } GameRules& rules() { return _rules; } + float countdownTimerPeriod; + Json::Value toJsonVal() const; private: std::string _name; diff --git a/src/core/AudioManager.cpp b/src/core/AudioManager.cpp index 5f7e6f1..c024524 100644 --- a/src/core/AudioManager.cpp +++ b/src/core/AudioManager.cpp @@ -79,6 +79,8 @@ void AudioManager::attachTo(RoundController &roundController) { this, &AudioManager::onPlayerLivesChanged); ofAddListener(roundController.logicController().playerLostEvent, this, &AudioManager::onPlayerLost); + ofAddListener(roundController.logicController().countdownTickEvent, + this, &AudioManager::onCountdownTick); } void AudioManager::detachFrom(RoundController &roundController) { @@ -96,6 +98,8 @@ void AudioManager::detachFrom(RoundController &roundController) { this, &AudioManager::onPlayerLivesChanged); ofRemoveListener(roundController.logicController().playerLostEvent, this, &AudioManager::onPlayerLost); + ofRemoveListener(roundController.logicController().countdownTickEvent, + this, &AudioManager::onCountdownTick); } void AudioManager::onRoundStarted(RoundStateEventArgs &e) { @@ -133,3 +137,7 @@ void AudioManager::onPlayerLivesChanged(PlayerStateEventArgs &e) { void AudioManager::onPlayerLost(PlayerStateEventArgs &e) { _playerLostSound.play(); } + +void AudioManager::onCountdownTick(TimerEventArgs &e) { + _countdownTimerTickSound.play(); +} diff --git a/src/core/AudioManager.h b/src/core/AudioManager.h index 86b4524..b4da970 100644 --- a/src/core/AudioManager.h +++ b/src/core/AudioManager.h @@ -35,7 +35,7 @@ class AudioManager { void onBallDestroyed(BallStateEventArgs& e); void onPlayerLivesChanged(PlayerStateEventArgs& e); void onPlayerLost(PlayerStateEventArgs& e); -// void onCountdownTimerT + void onCountdownTick(TimerEventArgs& e); const BleepoutParameters& _appParams; ofSoundPlayer _roundStartedSound; diff --git a/src/core/BleepoutApp.cpp b/src/core/BleepoutApp.cpp index 2ac5038..3ff02b3 100644 --- a/src/core/BleepoutApp.cpp +++ b/src/core/BleepoutApp.cpp @@ -128,7 +128,7 @@ void BleepoutApp::endRound() { _playerManager->setIsInRound(false); _audioManager->detachFrom(*_roundController); _roundController.reset(); - _endingRound = true; + _endingRound = false; notifyRoundEnded(); } diff --git a/src/core/GameEvents.cpp b/src/core/GameEvents.cpp index 66da3d2..1ea9706 100644 --- a/src/core/GameEvents.cpp +++ b/src/core/GameEvents.cpp @@ -99,6 +99,13 @@ void ModifierRemovedEventArgs::output(std::ostream &os) const { os << ")"; } +void TimerEventArgs::output(std::ostream& os) const { + os << "("; + os << "current:" << _currentTime << ", "; + os << "remaining:" << _remainingTime; + os << ")"; +} + void EventSource::logEvent(const char *name, const Outputable &event) const { if (loggingEnabled()) { diff --git a/src/core/GameEvents.h b/src/core/GameEvents.h index a8cf5dc..dc770b0 100644 --- a/src/core/GameEvents.h +++ b/src/core/GameEvents.h @@ -237,6 +237,18 @@ class PlayerYawPitchRollEventArgs { float _roll; }; +class TimerEventArgs : public Outputable { +public: + TimerEventArgs(float currentTime, float remainingTime) + : _currentTime(currentTime), _remainingTime(remainingTime) { } + float currentTime() const { return _currentTime; } + float remainingTime() const { return _remainingTime; } + void output(std::ostream& os) const override; +private: + float _currentTime; + float _remainingTime; +}; + class EventSource { public: EventSource() : _logLevel(OF_LOG_SILENT) {} diff --git a/src/core/LogicController.cpp b/src/core/LogicController.cpp index 062bc74..d9d2875 100644 --- a/src/core/LogicController.cpp +++ b/src/core/LogicController.cpp @@ -13,7 +13,7 @@ LogicController::LogicController(RoundState& state, RoundConfig& config, BleepoutParameters& appParams) :_state(state), _config(config), _appParams(appParams) -, _lastSpecifiedTimeLimitOffset(-1) +, _lastSpecifiedTimeLimitOffset(-1), _countdownTickPulser(1) , EventSource() { } void LogicController::setup() { @@ -40,9 +40,14 @@ void LogicController::update() { } _lastSpecifiedTimeLimitOffset = limit; } - if (_state.endTime > 0 && _state.remainingTime() <= 0) { - notifyTryEndRound(); - return; + if (_state.endTime > 0) { + if (_state.remainingTime() <= _config.countdownTimerPeriod && + _countdownTickPulser.update(_state.time)) + notifyCountdownTick(); + if (_state.remainingTime() <= 0) { + notifyTryEndRound(); + return; + } } for (auto& obj : _state.paddles()) { if (obj && obj->alive()) { @@ -256,3 +261,8 @@ void LogicController::notifyModifierRemoved(RoundState& state, const ModifierSpe ofNotifyEvent(modifierRemovedEvent, e); logEvent("ModifierRemoved", e); } +void LogicController::notifyCountdownTick() { + TimerEventArgs e(_state.time, _state.remainingTime()); + ofNotifyEvent(countdownTickEvent, e); + logEvent("CountdownTick", e); +} diff --git a/src/core/LogicController.h b/src/core/LogicController.h index ee5ee74..2e3519e 100644 --- a/src/core/LogicController.h +++ b/src/core/LogicController.h @@ -13,6 +13,7 @@ #include "GameEvents.h" #include "BleepoutConfig.h" #include "BleepoutParameters.h" +#include "Timing.h" class SpaceController; @@ -34,6 +35,7 @@ class LogicController : public EventSource { ofEvent modifierDestroyedEvent; ofEvent modifierAppliedEvent; ofEvent modifierRemovedEvent; + ofEvent countdownTickEvent; void setup(); void update(); @@ -57,6 +59,7 @@ class LogicController : public EventSource { void notifyModifierDestroyed(RoundState& state, Modifier* modifier); void notifyModifierApplied(RoundState& state, Modifier* modifier, GameObject* target); void notifyModifierRemoved(RoundState& state, const ModifierSpec &modifierSpec, GameObject* target); + void notifyCountdownTick(); void onCollision(CollisionEventArgs& e); @@ -73,6 +76,7 @@ class LogicController : public EventSource { RoundConfig& _config; BleepoutParameters& _appParams; float _lastSpecifiedTimeLimitOffset; + Pulser _countdownTickPulser; }; #endif /* defined(__bleepout__LogicController__) */ diff --git a/src/core/RoundManager.h b/src/core/RoundManager.h index 72c85c1..088082e 100644 --- a/src/core/RoundManager.h +++ b/src/core/RoundManager.h @@ -77,6 +77,7 @@ class RoundController : public EventSource bool notifyTryEndRound(EndRoundEventArgs &e); void onModifierAppeared(ModifierEventArgs& e); + void onCountdownTick(TimerEventArgs& e); bool _paused; float _startTime; diff --git a/src/rendering/Animations.cpp b/src/rendering/Animations.cpp index 79d656d..93d45c2 100644 --- a/src/rendering/Animations.cpp +++ b/src/rendering/Animations.cpp @@ -74,7 +74,7 @@ class MessageAnimation : public AnimationObject { virtual void draw(const RoundConfig& config) override; virtual void output(std::ostream& os) const override; private: - const MessageSpec& _message; + MessageSpec _message; ofTrueTypeFont& _font; }; @@ -191,6 +191,13 @@ void AnimationManager::onModifierRemoved(ModifierRemovedEventArgs &e) { addAnimation(anim); } +void AnimationManager::onCountdownTick(TimerEventArgs &e) { + int time = static_cast(e.remainingTime()); + addMessage(MessageSpec("Time: " + ofToString(time), ofColor(255, 0, 0)) + .setSize(10) + .setTiming(0, 0.9)); +} + void AnimationManager::attachTo(LogicController &roundEvents) { ofAddListener(roundEvents.brickDestroyedEvent, this, &AnimationManager::onBrickDestroyed); @@ -198,6 +205,8 @@ void AnimationManager::attachTo(LogicController &roundEvents) { &AnimationManager::onModifierApplied); ofAddListener(roundEvents.modifierRemovedEvent, this, &AnimationManager::onModifierRemoved); + ofAddListener(roundEvents.countdownTickEvent, this, + &AnimationManager::onCountdownTick); } void AnimationManager::detachFrom(LogicController &roundEvents) { @@ -207,4 +216,6 @@ void AnimationManager::detachFrom(LogicController &roundEvents) { &AnimationManager::onModifierApplied); ofRemoveListener(roundEvents.modifierRemovedEvent, this, &AnimationManager::onModifierRemoved); + ofRemoveListener(roundEvents.countdownTickEvent, this, + &AnimationManager::onCountdownTick); } diff --git a/src/rendering/Animations.h b/src/rendering/Animations.h index f93c246..0050b13 100644 --- a/src/rendering/Animations.h +++ b/src/rendering/Animations.h @@ -32,6 +32,7 @@ class AnimationManager { void onBrickDestroyed(BrickDestroyedEventArgs& e); void onModifierApplied(ModifierEventArgs& e); void onModifierRemoved(ModifierRemovedEventArgs& e); + void onCountdownTick(TimerEventArgs& e); private: RoundController& _roundController; ofTrueTypeFont _messageFont;