Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/gamestates/GSMainMenu.cc @ 7854

Last change on this file since 7854 was 7854, checked in by landauf, 13 years ago

detached AmbientSound from BaseObject - AmbientSound can not be placed directly in a level file anymore
instead added WorldAmbientSound, a BaseObject which can be placed in a level file to create and control ambient sound

with this change, the level can be destroyed completely because WorldAmbientSound can be deleted immediately at the end of the level, while the AmbientSound remains active until it faded out.

  • Property svn:eol-style set to native
File size: 6.9 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "GSMainMenu.h"
30
31#include <OgreSceneManager.h>
32
33#include "core/input/KeyBinderManager.h"
34#include "core/Game.h"
35#include "core/ConfigValueIncludes.h"
36#include "core/CoreIncludes.h"
37#include "core/GraphicsManager.h"
38#include "core/GUIManager.h"
39#include "core/command/ConsoleCommand.h"
40#include "Scene.h"
41#include "sound/AmbientSound.h"
42// HACK
43#include "core/input/InputManager.h"
44#include "core/input/InputState.h"
45
46namespace orxonox
47{
48    DeclareGameState(GSMainMenu, "mainMenu", false, true);
49
50    static const std::string __CC_startStandalone_name      = "startGame";
51    static const std::string __CC_startServer_name          = "startServer";
52    static const std::string __CC_startClient_name          = "startClient";
53    static const std::string __CC_startDedicated_name       = "startDedicated";
54    static const std::string __CC_startMainMenu_name        = "startMainMenu";
55    static const std::string __CC_setMainMenuSoundPath_name = "setMMSoundPath";
56
57    SetConsoleCommand(__CC_startStandalone_name,      &GSMainMenu::startStandalone).deactivate();
58    SetConsoleCommand(__CC_startServer_name,          &GSMainMenu::startServer    ).deactivate();
59    SetConsoleCommand(__CC_startClient_name,          &GSMainMenu::startClient    ).deactivate();
60    SetConsoleCommand(__CC_startDedicated_name,       &GSMainMenu::startDedicated ).deactivate();
61    SetConsoleCommand(__CC_startMainMenu_name,        &GSMainMenu::startMainMenu  ).deactivate();
62    SetConsoleCommand(__CC_setMainMenuSoundPath_name, &GSMainMenu::setMainMenuSoundPath).hide();
63
64    GSMainMenu::GSMainMenu(const GameStateInfo& info)
65        : GameState(info)
66    {
67        RegisterRootObject(GSMainMenu);
68
69        InputManager::getInstance().createInputState("MainMenuHackery", true, true)->setKeyHandler(KeyBinderManager::getInstance().getDefaultAsHandler());
70
71        // create an empty Scene
72        this->scene_ = new Scene(NULL);
73        this->scene_->setSyncMode( 0x0 );
74        // and a Camera
75        this->camera_ = this->scene_->getSceneManager()->createCamera("mainMenu/Camera");
76        if (GameMode::playsSound())
77        {
78            // Load sound
79            this->ambient_ = new AmbientSound();
80        }
81    }
82
83    GSMainMenu::~GSMainMenu()
84    {
85        if (GameMode::playsSound())
86            this->ambient_->destroy();
87
88        InputManager::getInstance().destroyState("MainMenuHackery");
89
90        this->scene_->getSceneManager()->destroyCamera(this->camera_);
91        this->scene_->destroy();
92    }
93
94    void GSMainMenu::activate()
95    {
96        // show main menu
97        GUIManager::getInstance().showGUI("MainMenu", true);
98        GUIManager::getInstance().setCamera(this->camera_);
99        GUIManager::getInstance().setBackgroundImage("MainMenuBackground", "Background");
100        GraphicsManager::getInstance().setCamera(this->camera_);
101
102        InputManager::getInstance().enterState("MainMenuHackery");
103
104        ModifyConsoleCommand(__CC_startStandalone_name).activate();
105        ModifyConsoleCommand(__CC_startServer_name    ).activate();
106        ModifyConsoleCommand(__CC_startClient_name    ).activate();
107        ModifyConsoleCommand(__CC_startDedicated_name ).activate();
108        ModifyConsoleCommand(__CC_startMainMenu_name  ).activate();
109        ModifyConsoleCommand(__CC_setMainMenuSoundPath_name).setObject(this);
110
111        KeyBinderManager::getInstance().setToDefault();
112
113        this->setConfigValues();
114
115        if (GameMode::playsSound())
116        {
117            this->ambient_->setLooping(true);
118            this->ambient_->play(); // works without source
119        }
120    }
121
122    void GSMainMenu::deactivate()
123    {
124        if (GameMode::playsSound())
125        {
126            this->ambient_->stop();
127        }
128
129        InputManager::getInstance().leaveState("MainMenuHackery");
130
131        GUIManager::getInstance().setCamera(0);
132        GUIManager::getInstance().setBackgroundImage("");
133        GUIManager::hideGUI("MainMenu");
134        GraphicsManager::getInstance().setCamera(0);
135
136        ModifyConsoleCommand(__CC_startStandalone_name).deactivate();
137        ModifyConsoleCommand(__CC_startServer_name    ).deactivate();
138        ModifyConsoleCommand(__CC_startClient_name    ).deactivate();
139        ModifyConsoleCommand(__CC_startDedicated_name ).deactivate();
140        ModifyConsoleCommand(__CC_startMainMenu_name  ).deactivate();
141        ModifyConsoleCommand(__CC_setMainMenuSoundPath_name).setObject(0);
142    }
143
144    void GSMainMenu::update(const Clock& time)
145    {
146    }
147
148    void GSMainMenu::setConfigValues()
149    {
150        SetConfigValue(soundPathMain_, "mainmenu.ogg")
151            .description("Contains the path to the main menu sound file.")
152            .callback(this, &GSMainMenu::reloadSound);
153    }
154
155    void GSMainMenu::reloadSound()
156    {
157        if (GameMode::playsSound())
158        {
159            this->ambient_->setAmbientSource(soundPathMain_);
160        }
161    }
162
163    const std::string& GSMainMenu::getMainMenuSoundPath()
164    {
165        return soundPathMain_;
166    }
167
168    void GSMainMenu::setMainMenuSoundPath(const std::string& path)
169    {
170        ModifyConfigValue(soundPathMain_, set, path);
171    }
172
173    void GSMainMenu::startStandalone()
174    {
175        // HACK - HACK
176        Game::getInstance().popState();
177        Game::getInstance().requestStates("standalone, level");
178    }
179
180    void GSMainMenu::startServer()
181    {
182        // HACK - HACK
183        Game::getInstance().popState();
184        Game::getInstance().requestStates("server, level");
185    }
186
187    void GSMainMenu::startClient()
188    {
189        // HACK - HACK
190        Game::getInstance().popState();
191        Game::getInstance().requestStates("client, level");
192    }
193
194    void GSMainMenu::startDedicated()
195    {
196        // HACK - HACK
197        Game::getInstance().popState();
198        Game::getInstance().popState();
199        Game::getInstance().requestStates("server, level");
200    }
201    void GSMainMenu::startMainMenu()
202    {
203        // HACK - HACK
204        Game::getInstance().popState();
205        Game::getInstance().popState();
206        Game::getInstance().requestStates("mainmenu");
207    }
208}
Note: See TracBrowser for help on using the repository browser.