Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/story_entities/menu/game_menu.cc @ 8734

Last change on this file since 8734 was 8719, checked in by bensch, 18 years ago

merged the water branche back. conflicts resolved in favour of the trunk

File size: 10.5 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12   main-programmer: Patrick Boenzli
13
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD
17
18
19#include "game_menu.h"
20
21#include "event_handler.h"
22
23#include "state.h"
24#include "class_list.h"
25
26#include "util/loading/load_param.h"
27#include "util/loading/factory.h"
28#include "util/loading/resource_manager.h"
29
30#include "graphics_engine.h"
31#include "camera.h"
32#include "sound_engine.h"
33
34#include "sound_source.h"
35
36#include "glgui.h"
37#include "menu/glgui_imagebutton.h"
38
39//! This creates a Factory to fabricate a GameMenu
40CREATE_FACTORY(GameMenu, CL_GAME_MENU);
41
42
43
44GameMenu::GameMenu(const TiXmlElement* root)
45    : GameWorld()
46{
47  this->setClassID(CL_GAME_MENU, "GameMenu");
48  this->setName("GameMenu uninitialized");
49
50  this->dataTank = new GameMenuData();
51
52  this->cameraVector = Vector(50.0, 0.0, 0.0);
53
54  if (root != NULL)
55    this->loadParams(root);
56
57  State::setMenuID(this->getNextStoryID());
58}
59
60/**
61*  @brief remove the GameMenu from memory
62*
63*  delete everything explicitly, that isn't contained in the parenting tree!
64*  things contained in the tree are deleted automaticaly
65*/
66GameMenu::~GameMenu ()
67{
68  PRINTF(3)("GameMenu::~GameMenu() - deleting current world\n");
69
70  if( this->dataTank)
71    delete this->dataTank;
72  delete OrxGui::GLGuiHandler::getInstance( );
73}
74
75
76/**
77* @brief loads the parameters of a GameMenu from an XML-element
78* @param root the XML-element to load from
79*/
80void GameMenu::loadParams(const TiXmlElement* root)
81{
82  /* skip the GameWorld, since it does not define any useful loadParams for this class */
83  //static_cast<GameWorld*>(this)->loadParams(root);
84  GameWorld::loadParams(root);
85
86  PRINTF(4)("Loaded GameMenu specific stuff\n");
87}
88
89
90/**
91* @brief this is executed just before load
92*
93* since the load function sometimes needs data, that has been initialized
94* before the load and after the proceeding storyentity has finished
95*/
96ErrorMessage GameMenu::init()
97{
98  /* call underlying init funciton */
99  GameWorld::init();
100
101  this->subscribeEvent(ES_MENU, SDLK_UP);
102  this->subscribeEvent(ES_MENU, SDLK_DOWN);
103  this->subscribeEvent(ES_MENU, SDLK_RETURN);
104  this->subscribeEvent(ES_MENU, SDLK_SPACE);
105  this->subscribeEvent(ES_MENU, SDLK_ESCAPE);
106
107  this->dataTank->localCamera->setRelCoor(this->cameraVector);
108
109  GraphicsEngine::getInstance()->displayFPS(false);
110
111  return ErrorMessage();
112}
113
114
115/**
116* @brief load the data
117*/
118ErrorMessage GameMenu::loadData()
119{
120  this->mainMenuBox = NULL;
121
122  this->levelsBox = NULL;
123  this->networkBox = NULL;
124
125  this->optionsBox = NULL;
126  this->generalBox = NULL;
127  this->audioBox = NULL;
128  this->videoBox = NULL;
129  this->controlBox = NULL;
130  this->levelsBox = NULL;
131
132  this->currentlyOpened = NULL;
133
134  return GameWorld::loadData();
135}
136
137
138void GameMenu::showMainMenu()
139{
140  if (mainMenuBox == NULL)
141  {
142    this->mainMenuBox = new OrxGui::GLGuiBox();
143    {
144      OrxGui::GLGuiButton* startButton = new OrxGui::GLGuiPushButton("Play");
145      startButton->connect(SIGNAL(startButton, released), this, SLOT(GameMenu, showCampaigns));
146      this->mainMenuBox->pack(startButton);
147
148      OrxGui::GLGuiButton* networkButton = new OrxGui::GLGuiPushButton("MultiPlayer");
149      networkButton->connect(SIGNAL(networkButton, released), this, SLOT(GameMenu, showMultiPlayer));
150      this->mainMenuBox->pack(networkButton);
151
152      OrxGui::GLGuiButton* optionsButton = new OrxGui::GLGuiPushButton("Options");
153      optionsButton->connect(SIGNAL(optionsButton, released), this, SLOT(GameMenu, showOptionsMenu));
154      this->mainMenuBox->pack(optionsButton);
155
156
157      OrxGui::GLGuiButton* quitButton = new OrxGui::GLGuiPushButton("Quit");
158      this->mainMenuBox->pack(quitButton);
159      quitButton->connect(SIGNAL(quitButton, released), this, SLOT(GameMenu, quitMenu));
160    }
161  }
162  this->mainMenuBox->showAll();
163
164  this->mainMenuBox->setRelCoor2D(200, 100);
165}
166
167
168void GameMenu::showCampaigns()
169{
170  if (this->levelsBox == NULL)
171  {
172    this->levelsBox = new OrxGui::GLGuiBox(OrxGui::Horizontal);
173    {
174      OrxGui::GLGuiBox* labelBox = new OrxGui::GLGuiBox();
175
176      OrxGui::GLGuiImage* image = new OrxGui::GLGuiImage();
177      image->show();
178      image->setWidgetSize( 250, 200);
179      image->setAbsCoor2D(400, 150);
180      image->setForegroundColor(Color( 1,1,1,.6));
181
182      const std::list<BaseObject*>* storyEntities = ClassList::getList(CL_STORY_ENTITY);
183      std::list<BaseObject*>::const_iterator it;
184      for( it = storyEntities->begin(); it != storyEntities->end(); it++)
185      {
186        StoryEntity* se = dynamic_cast<StoryEntity*>(*it);
187        if( se->isContainedInMenu())
188        {
189
190          printf("%s\n", se->getMenuScreenshoot().c_str());
191          OrxGui::GLGuiImageButton* button = new OrxGui::GLGuiImageButton(se->getName(), se->getStoryID(), se->getMenuScreenshoot(), image);
192          button->connect(SIGNAL(button, startLevel), this, SLOT(GameMenu, startLevel));
193          labelBox->pack(button);
194
195          // generating screenshoot item
196          /*
197          ImageEntity* ie = new ImageEntity();
198          ie->setVisibility(false);
199          ie->setBindNode((const PNode*)NULL);
200          ie->setTexture(se->getMenuScreenshoot());
201          ie->setRelCoor2D(State::getResX() / 2.0f + 250.0f, State::getResY() / 2.0f);
202          ie->setSize2D(140.0f, 105.0f);
203          this->menuLayers[1].screenshootList.push_back(ie);
204          */
205        }
206      }
207
208      this->levelsBox->pack(labelBox);
209      this->levelsBox->pack(image);
210    }
211
212  }
213
214  this->showSecondLevelElement(this->levelsBox);
215
216}
217
218void GameMenu::showMultiPlayer()
219{}
220
221void GameMenu::showOptionsMenu()
222{
223  if (this->optionsBox == NULL)
224  {
225    this->optionsBox = new OrxGui::GLGuiBox();
226    {
227      OrxGui::GLGuiButton* generalButton = new OrxGui::GLGuiPushButton("General");
228      optionsBox->pack(generalButton);
229
230      OrxGui::GLGuiButton* audioButton = new OrxGui::GLGuiPushButton("Audio");
231      optionsBox->pack(audioButton);
232
233      OrxGui::GLGuiButton* videoButton = new OrxGui::GLGuiPushButton("Video");
234      optionsBox->pack(videoButton);
235
236      OrxGui::GLGuiButton* controlButton = new OrxGui::GLGuiPushButton("Control");
237      optionsBox->pack(controlButton);
238
239
240      //      for (unsigned int i = 0; i <
241      //OrxGui::GLGuiButton*
242
243    }
244  }
245
246  this->showSecondLevelElement(this->optionsBox);
247}
248
249
250void GameMenu::showSecondLevelElement(OrxGui::GLGuiBox* element)
251{
252  if (this->currentlyOpened != NULL && this->currentlyOpened != element)
253    this->currentlyOpened->hideAll();
254
255  element->showAll();
256  element->setRelCoor2D(200, 100);
257
258  this->currentlyOpened = element;
259
260  this->mainMenuBox->setRelCoorSoft2D(50, 100, 5);
261}
262
263
264
265
266
267void GameMenu::startLevel(int levelID)
268{
269  this->setNextStoryID( levelID);
270  this->stop();
271}
272
273/**
274* @brief set the Sound to play when switching menu entry.
275* @param selectorSound the sound to load.
276*/
277void GameMenu::setSelectorSound(const std::string& selectorSound)
278{
279  this->selectorSource = OrxSound::SoundEngine::getInstance()->createSource(selectorSound, NULL);
280}
281
282ErrorMessage GameMenu::unloadData()
283{
284  this->unsubscribeEvents(ES_MENU);
285
286  return GameWorld::unloadData();
287}
288
289
290/**
291* @brief start the menu
292*/
293bool GameMenu::start()
294{
295  EventHandler::getInstance()->pushState(ES_MENU);
296
297  this->showMainMenu();
298  OrxGui::GLGuiHandler::getInstance()->activateCursor();
299  OrxGui::GLGuiHandler::getInstance()->activate();
300  OrxGui::GLGuiHandler::getInstance()->cursor()->loadTextureSequence(ResourceManager::getInstance()->getDataDir() + "/" + "maps/reap_mouse/reap_mouse_##.png", 1, 49);
301
302  /* now call the underlying*/
303  return GameWorld::start();
304}
305
306
307
308/**
309* stop the menu
310*/
311bool GameMenu::stop()
312{
313  EventHandler::getInstance()->popState();
314
315  /* now call the underlying*/
316  return GameWorld::stop();
317}
318
319
320/**
321*  override the standard tick for more functionality
322*/
323void GameMenu::tick()
324{
325  GameWorld::tick();
326
327  // Make the GLGui tick.
328  OrxGui::GLGuiHandler::getInstance()->tick(this->dtS);
329
330  this->animateScene(this->dtS);
331}
332
333
334/**
335* @brief no collision detection in the menu
336*/
337void GameMenu::collide()
338{
339  //   this->dataTank->localCamera->
340}
341
342
343/**
344* @brief animate the scene
345*/
346void GameMenu::animateScene(float dt)
347{
348  Quaternion q(/*0.00005*/ dt * .1, Vector(0.0, 1.0, 0.0));
349  this->cameraVector = q.apply(this->cameraVector);
350  this->dataTank->localCamera->setRelCoor(this->cameraVector);
351  this->dataTank->localCamera->getTarget()->setRelCoorSoft(0,0,0);
352}
353
354void GameMenu::quitMenu()
355{
356  this->setNextStoryID(WORLD_ID_GAMEEND);
357  this->stop();
358}
359
360
361/**
362* @brief event dispatcher funciton
363* @param event the incoming event
364*/
365void GameMenu::process(const Event &event)
366{
367  if( event.type == SDLK_ESCAPE && event.bPressed == true)
368  {
369    this->setNextStoryID(WORLD_ID_GAMEEND);
370    this->stop();
371  }
372
373}
374
375
376
377/**********************************************************************************************
378GameMenuData
379**********************************************************************************************/
380
381
382/**
383* GameMenuData constructor
384*/
385GameMenuData::GameMenuData()
386{}
387
388/**
389* GameMenuData decontructor
390*/
391GameMenuData::~GameMenuData()
392{}
393
394
395/**
396*  initialize the GameWorldDataData
397*/
398ErrorMessage GameMenuData::init()
399{
400  /* call underlying function */
401  return GameWorldData::init();
402}
403
404
405/**
406*  loads the GUI data
407* @param root reference to the xml root element
408*/
409ErrorMessage GameMenuData::loadGUI(const TiXmlElement* root)
410{
411  /* call underlying function */
412  return GameWorldData::loadGUI(root);
413}
414
415
416/**
417*  unloads the GUI data
418*/
419ErrorMessage GameMenuData::unloadGUI()
420{
421  /* call underlying function */
422  return GameWorldData::unloadGUI();
423}
424
425
426/**
427*  overloads the GameWorld::loadWorldEntities(...) class since the menu WorldEntity loading is different (less loading stuff)
428* @param root reference to the xml root parameter
429*/
430ErrorMessage GameMenuData::loadWorldEntities(const TiXmlElement* root)
431{
432  return GameWorldData::loadWorldEntities(root);
433}
434
435
436/**
437*  unloads the world entities from the xml file
438*/
439ErrorMessage GameMenuData::unloadWorldEntities()
440{
441  /* call underlying function */
442  return GameWorldData::unloadWorldEntities();
443}
444
445
446/**
447*  loads the scene data
448* @param root reference to the xml root element
449*/
450ErrorMessage GameMenuData::loadScene(const TiXmlElement* root)
451{
452  /* call underlying function */
453  return GameWorldData::loadScene(root);
454}
455
456
457/**
458*  unloads the scene data
459*/
460ErrorMessage GameMenuData::unloadScene()
461{
462  /* call underlying function */
463  return GameWorldData::unloadScene();
464}
465
466
467
Note: See TracBrowser for help on using the repository browser.