Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/gui/src/story_entities/simple_game_menu.cc @ 8013

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

gui: nicer, just nicer …

File size: 19.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 "simple_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 "fast_factory.h"
28#include "util/loading/factory.h"
29
30#include "world_entity.h"
31#include "elements/image_entity.h"
32#include "terrain.h"
33#include "camera.h"
34
35#include "graphics_engine.h"
36#include "object_manager.h"
37#include "sound_engine.h"
38#include "sound_source.h"
39
40#include "cd_engine.h"
41
42#include "glgui.h"
43
44//! This creates a Factory to fabricate a SimpleGameMenu
45CREATE_FACTORY(SimpleGameMenu, CL_SIMPLE_GAME_MENU);
46
47
48
49SimpleGameMenu::SimpleGameMenu(const TiXmlElement* root)
50    : GameWorld()
51{
52  this->setClassID(CL_SIMPLE_GAME_MENU, "SimpleGameMenu");
53  this->setName("SimpleGameMenu uninitialized");
54
55  this->dataTank = new SimpleGameMenuData();
56
57  this->cameraVector = Vector(50.0, 0.0, 0.0);
58  this->menuLayers.push_back(MenuLayer());
59  this->menuLayers.push_back(MenuLayer());
60
61  this->layerIndex = 0;
62  this->menuSelectedIndex = 0;
63  this->selectorSource = NULL;
64
65
66  /// GUI
67  ///(this is as modular as it is possible).
68  OrxGui::GLGuiPushButton* pb = new OrxGui::GLGuiPushButton("PUSH ME");
69  //pb->connectSignal(OrxGui::Signal_release, this, createExecutor<SimpleGameMenu>(&SimpleGameMenu::enterGui));
70  pb->connect(SIGNAL(pb, released), this, SLOT(SimpleGameMenu, enterGui));
71  pb->show();
72  pb->setAbsCoor2D(50, 50);
73
74  OrxGui::GLGuiHandler::getInstance()->activateCursor();
75  OrxGui::GLGuiHandler::getInstance()->activate();
76  /////
77
78  if (root != NULL)
79    this->loadParams(root);
80
81  State::setMenuID(this->getNextStoryID());
82}
83
84/// HACK only for testing.
85void SimpleGameMenu::enterGui()
86{
87
88  OrxGui::GLGuiBox* box = new OrxGui::GLGuiBox();
89  {
90    ///
91    OrxGui::GLGuiButton* dnpb = new OrxGui::GLGuiCheckButton("Push the button");
92
93    box->pack(dnpb);
94
95    OrxGui::GLGuiPushButton* rdnpb = new OrxGui::GLGuiPushButton("Quit ORXONOX!!");
96    rdnpb->connect(SIGNAL(rdnpb, released), this, SLOT(SimpleGameMenu, quitMenu));
97
98    box->pack(rdnpb);
99
100    OrxGui::GLGuiInputLine* input = new OrxGui::GLGuiInputLine();
101    input->setText("input some text here");
102    input->connect(SIGNAL(input, textChanged), this, SLOT(SimpleGameMenu, TEST));
103    box->pack(input);
104
105    OrxGui::GLGuiSlider* slider = new OrxGui::GLGuiSlider();
106    slider->connect(SIGNAL(slider, valueChanged), this, SLOT(SimpleGameMenu, TEST));
107    slider->connect(SIGNAL(slider, valueChanged), box, SLOT(OrxGui::GLGuiWidget, setBackgroundColor));
108    slider->setRange(0, 1);
109    slider->setValue(slider->min());
110    box->pack(slider);
111  }
112  box->setAbsCoor2D(50, 200);
113
114  box->showAll();
115
116
117  OrxGui::GLGuiBox* imageSelector = new OrxGui::GLGuiBox();
118  {
119
120    image = new OrxGui::GLGuiImage();
121    image->setWidgetSize(200, 200);
122    image->setAbsCoor2D(300, 300);
123    imageSelector->pack(image);
124
125    imageName = new OrxGui::GLGuiInputLine();
126    imageSelector->pack(imageName);
127
128    OrxGui::GLGuiSlider* slider = new OrxGui::GLGuiSlider();
129    slider->setWidgetSize(200, 30);
130    slider->setRange(0, 100);
131    slider->setStep(1);
132    slider->setValue(slider->min());
133    slider->connect(SIGNAL(slider, valueChanged), this, SLOT(SimpleGameMenu, setImage));
134
135    imageSelector->pack(slider);
136    slider->setValue(0);
137  }
138  imageSelector->showAll();
139  imageSelector->setAbsCoor2D(400, 30);
140
141
142  /////
143}
144
145
146#include "class_list.h"
147void SimpleGameMenu::setImage(int i)
148{
149  const std::list<BaseObject*>* textures = ClassList::getList(CL_TEXTURE);
150
151  if(textures)
152  {
153    std::list<BaseObject*>::const_iterator test = textures->begin();
154    std::list<BaseObject*>::const_iterator lastOK = textures->begin();
155    while (true)
156    {
157      if (--i == 0 || test == textures->end())
158        break;
159      if (dynamic_cast<Texture*>(*test)->getTexture() != 0)
160        lastOK = test;
161      test++;
162    }
163    this->image->loadImageFromTexture(*dynamic_cast<Texture*>(*lastOK));
164    this->imageName->setText((*lastOK)->getName());
165  }
166}
167
168
169#include "threading.h"
170void SimpleGameMenu::execURL() const
171{
172  std::string URL = "http://www.orxonox.net";
173  SDL_CreateThread(startURL, (void*)&URL);
174}
175
176#ifdef __OSX__
177#include <ApplicationServices/ApplicationServices.h>
178#elif defined __WIN32__
179#include <shellapi.h>
180#endif
181
182int SimpleGameMenu::startURL(void* url)
183{
184  std::string URL = *(std::string*)url;
185#ifdef __linux__
186  system ((std::string("firefox ") + URL).c_str());
187#elif defined __OSX__
188  CFURLRef url_handle = CFURLCreateWithBytes (NULL, (UInt8 *)URL.c_str(), URL.size(),
189                        kCFStringEncodingASCII, NULL);
190  LSOpenCFURLRef (url_handle, NULL);
191  CFRelease (url_handle);
192#elif defined __WIN32__
193  ShellExecute(GetActiveWindow(),
194               "open", URL.c_str(), NULL, NULL, SW_SHOWNORMAL);
195}
196#endif
197  PRINTF(3)("loaded external webpage %s\n", URL.c_str());
198}
199
200/**
201*  @brief remove the SimpleGameMenu from memory
202*
203*  delete everything explicitly, that isn't contained in the parenting tree!
204*  things contained in the tree are deleted automaticaly
205*/
206SimpleGameMenu::~SimpleGameMenu ()
207{
208  PRINTF(3)("SimpleGameMenu::~SimpleGameMenu() - deleting current world\n");
209
210  if( this->dataTank)
211    delete this->dataTank;
212  delete OrxGui::GLGuiHandler::getInstance( );
213}
214
215
216/**
217* @brief loads the parameters of a SimpleGameMenu from an XML-element
218* @param root the XML-element to load from
219*/
220void SimpleGameMenu::loadParams(const TiXmlElement* root)
221{
222  /* skip the GameWorld, since it does not define any useful loadParams for this class */
223  //static_cast<GameWorld*>(this)->loadParams(root);
224  GameWorld::loadParams(root);
225
226  PRINTF(4)("Loaded SimpleGameMenu specific stuff\n");
227}
228
229
230/**
231* @brief this is executed just before load
232*
233* since the load function sometimes needs data, that has been initialized
234* before the load and after the proceeding storyentity has finished
235*/
236ErrorMessage SimpleGameMenu::init()
237{
238  /* call underlying init funciton */
239  GameWorld::init();
240
241  this->subscribeEvent(ES_MENU, SDLK_UP);
242  this->subscribeEvent(ES_MENU, SDLK_DOWN);
243  this->subscribeEvent(ES_MENU, SDLK_RETURN);
244  this->subscribeEvent(ES_MENU, SDLK_SPACE);
245  this->subscribeEvent(ES_MENU, SDLK_ESCAPE);
246
247  this->dataTank->localCamera->setRelCoor(this->cameraVector);
248
249  GraphicsEngine::getInstance()->displayFPS(false);
250
251  this->layerIndex = 0;
252  this->menuSelectedIndex = 0;
253}
254
255
256/**
257* @brief load the data
258*/
259ErrorMessage SimpleGameMenu::loadData()
260{
261  GameWorld::loadData();
262
263  if (this->dataXML != NULL)
264  {
265    LoadParam(dataXML, "selector-sound", this, SimpleGameMenu, setSelectorSound);
266
267    TiXmlElement* element = this->dataXML->FirstChildElement("Elements");
268
269
270    if( element == NULL)
271    {
272      PRINTF(1)("SimpleGameMenu is missing 'Elements'\n");
273    }
274    else
275    {
276      element = element->FirstChildElement();
277      // load Players/Objects/Whatever
278      PRINTF(4)("Loading Elements\n");
279      while( element != NULL)
280      {
281        BaseObject* created = Factory::fabricate(element);
282        if( created != NULL )
283        {
284          PRINTF(4)("Created a %s::%s\n", created->getClassName(), created->getName());
285          if (!created->isA(CL_ELEMENT_2D))
286            PRINTF(2)("Error the Created Entity is not an Element2D but an %s::%s\n", created->getClassName(), created->getName());
287        }
288        element = element->NextSiblingElement();
289      }
290      PRINTF(4)("Done loading Elements\n");
291    }
292  }
293
294  /* get the menu list */
295  const std::list<BaseObject*>* imageEntityList = ClassList::getList(CL_IMAGE_ENTITY);
296  std::list<BaseObject*>::const_iterator entity;
297  for (entity = imageEntityList->begin(); entity != imageEntityList->end(); entity++)
298  {
299
300    if( !strcmp("Selector_Menu", (*entity)->getName()))
301    {
302      this->menuSelector = dynamic_cast<ImageEntity*>(*entity);
303      this->menuSelector->setBindNode((const PNode*)NULL);
304    }
305  }
306
307  imageEntityList = ClassList::getList(CL_TEXT_ELEMENT);
308  for (entity = imageEntityList->begin(); entity != imageEntityList->end(); entity++)
309  {
310    if( !strcmp( "StartGame_Menu", (*entity)->getName()))
311    {
312      this->menuStartGame = dynamic_cast<TextElement*>(*entity);
313      this->menuStartGame->setBindNode((const PNode*)NULL);
314      this->menuStartGame->setRelCoor2D(State::getResX() / 2.0f,
315                                        State::getResY() / 2.0f - 60.0f);
316      this->menuLayers[0].menuList.push_back(dynamic_cast<TextElement*>(*entity));
317
318    }
319    else if( !strcmp( "Multiplayer_Menu", (*entity)->getName()))
320    {
321      this->menuStartMultiplayerGame = dynamic_cast<TextElement*>(*entity);
322      this->menuStartMultiplayerGame->setBindNode((const PNode*)NULL);
323      this->menuStartMultiplayerGame->setRelCoor2D(State::getResX() / 2.0f,
324          State::getResY() / 2.0f + ((this->menuLayers[0].menuList.size() -1 ) * 60.0f));
325      this->menuLayers[0].menuList.push_back(dynamic_cast<TextElement*>(*entity));
326    }
327    else if( !strcmp( "Quit_Menu", (*entity)->getName()))
328    {
329      this->menuQuitGame = dynamic_cast<TextElement*>(*entity);
330      this->menuQuitGame->setBindNode((const PNode*)NULL);
331      this->menuQuitGame->setRelCoor2D(State::getResX() / 2.0f,
332                                       State::getResY() / 2.0f + ((this->menuLayers[0].menuList.size() -1 )* 60.0f));
333      this->menuLayers[0].menuList.push_back(dynamic_cast<TextElement*>(*entity));
334    }
335  }
336  this->menuSelected->getNullElement()->update2D(0.1f);
337  this->menuSelectedIndex = 0;
338  this->menuSelected = this->menuLayers[0].menuList[this->menuSelectedIndex];
339  this->sliderTo(this->menuSelected, 0.0f);
340
341
342  // loading the storyentities submenu (singleplayer)
343  const std::list<BaseObject*>* storyEntities = ClassList::getList(CL_STORY_ENTITY);
344  std::list<BaseObject*>::const_iterator it;
345  for( it = storyEntities->begin(); it != storyEntities->end(); it++)
346  {
347    StoryEntity* se = dynamic_cast<StoryEntity*>(*it);
348    if( se->isContainedInMenu())
349    {
350      this->menuLayers[1].storyList.push_back(se);
351
352      // generating menu item
353      TextElement* te = new TextElement();
354      te->setVisibility(false);
355      te->setText(se->getName());
356      te->setRelCoor2D(State::getResX() / 2.0f - 200.0f, State::getResY() / 2.0f + ((this->menuLayers[1].menuList.size() - 2.0f) * 60.0f));
357      this->menuLayers[1].menuList.push_back(te);
358
359      // generating screenshoot item
360      ImageEntity* ie = new ImageEntity();
361      ie->setVisibility(false);
362      ie->setBindNode((const PNode*)NULL);
363      ie->setTexture(se->getMenuScreenshoot());
364      ie->setRelCoor2D(State::getResX() / 2.0f + 250.0f, State::getResY() / 2.0f);
365      ie->setSize2D(140.0f, 105.0f);
366      this->menuLayers[1].screenshootList.push_back(ie);
367    }
368  }
369}
370
371/**
372* @brief set the Sound to play when switching menu entry.
373* @param selectorSound the sound to load.
374*/
375void SimpleGameMenu::setSelectorSound(const std::string& selectorSound)
376{
377  this->selectorSource = OrxSound::SoundEngine::getInstance()->createSource(selectorSound, NULL);
378}
379
380ErrorMessage SimpleGameMenu::unloadData()
381{
382  this->unsubscribeEvents(ES_MENU);
383
384  std::vector<MenuLayer>::iterator mit;
385  for(mit = this->menuLayers.begin(); mit != this->menuLayers.end(); mit++)
386  {
387    while(!(*mit).menuList.empty())
388    {
389      delete (*mit).menuList.back();
390      (*mit).menuList.pop_back();
391    }
392
393    (*mit).menuList.clear();
394    (*mit).storyList.clear();
395    (*mit).screenshootList.clear();
396  }
397
398  // delete the SoundSource.
399  if (this->selectorSource != NULL)
400    delete this->selectorSource;
401  this->selectorSource = NULL;
402
403  GameWorld::unloadData();
404}
405
406
407/**
408* @brief start the menu
409*/
410bool SimpleGameMenu::start()
411{
412  EventHandler::getInstance()->pushState(ES_MENU);
413
414  /* now call the underlying*/
415  GameWorld::start();
416}
417
418
419
420/**
421* stop the menu
422*/
423bool SimpleGameMenu::stop()
424{
425  EventHandler::getInstance()->popState();
426
427  /* now call the underlying*/
428  GameWorld::stop();
429}
430
431
432/**
433*  override the standard tick for more functionality
434*/
435void SimpleGameMenu::tick()
436{
437  GameWorld::tick();
438
439  // Make the GLGui tick.
440  OrxGui::GLGuiHandler::getInstance()->tick(this->dtS);
441
442  this->animateScene(this->dtS);
443}
444
445
446/**
447* @brief no collision detection in the menu
448*/
449void SimpleGameMenu::collide()
450{
451  //   this->dataTank->localCamera->
452}
453
454
455/**
456* @brief animate the scene
457*/
458void SimpleGameMenu::animateScene(float dt)
459{
460  Quaternion q(/*0.00005*/ dt * .1, Vector(0.0, 1.0, 0.0));
461  this->cameraVector = q.apply(this->cameraVector);
462  this->dataTank->localCamera->setRelCoor(this->cameraVector);
463  this->dataTank->localCamera->getTarget()->setRelCoorSoft(0,0,0);
464}
465
466void SimpleGameMenu::quitMenu()
467{
468  this->setNextStoryID(WORLD_ID_GAMEEND);
469  this->stop();
470}
471
472
473/**
474* @brief event dispatcher funciton
475* @param event the incoming event
476*/
477void SimpleGameMenu::process(const Event &event)
478{
479  /* ----------------- LAYER 1 ---------------*/
480  if( this->layerIndex == 0)
481  {
482    if( event.type == SDLK_RETURN && event.bPressed == true)
483    {
484      if( this->menuSelected == this->menuQuitGame)
485      {
486        this->setNextStoryID(WORLD_ID_GAMEEND);
487        this->stop();
488      }
489      if( this->menuSelected == this->menuStartGame)
490      {
491        // switch to first submenu
492        if( this->menuLayers[1].menuList.size() == 0)
493        {
494          PRINTF(1)("Haven't got any StoryEntities to play!\n");
495          return;
496        }
497
498        this->switchMenuLayer(this->layerIndex, 1);
499      }
500    }
501    if( event.type == SDLK_ESCAPE && event.bPressed == true)
502    {
503      this->setNextStoryID(WORLD_ID_GAMEEND);
504      this->stop();
505    }
506  }  /* ----------------- LAYER 2 ---------------*/
507  else if( this->layerIndex == 1)
508  {
509    if( event.type == SDLK_RETURN && event.bPressed == true)
510    {
511      this->setNextStoryID( this->menuLayers[1].storyList[this->menuSelectedIndex]->getStoryID());
512      this->stop();
513    }
514    if( event.type == SDLK_ESCAPE && event.bPressed == true)
515    {
516      this->switchMenuLayer(this->layerIndex, 0);
517    }
518  }
519
520
521
522  // The menu selction cursor
523  if( event.type == SDLK_DOWN && event.bPressed == true)
524  {
525    if(this->menuSelectedIndex < (this->menuLayers[this->layerIndex].menuList.size() - 1))
526    {
527      this->menuSelected = this->menuLayers[this->layerIndex].menuList[++this->menuSelectedIndex];
528      this->sliderTo(this->menuSelected, 5.0f);
529      if (this->selectorSource != NULL)
530        this->selectorSource->play();
531
532      if( this->layerIndex == 1)
533      {
534        this->menuLayers[1].screenshootList[this->menuSelectedIndex]->setVisibility(true);
535        this->menuLayers[1].screenshootList[this->menuSelectedIndex-1]->setVisibility(false);
536      }
537    }
538  }
539  else if( event.type == SDLK_UP && event.bPressed == true)
540  {
541    if(this->menuSelectedIndex > 0)
542    {
543      this->menuSelected = this->menuLayers[this->layerIndex].menuList[--this->menuSelectedIndex];
544      this->sliderTo(this->menuSelected, 5.0f);
545      if (this->selectorSource != NULL)
546        this->selectorSource->play();
547
548      if( this->layerIndex == 1)
549      {
550        this->menuLayers[1].screenshootList[this->menuSelectedIndex]->setVisibility(true);
551        this->menuLayers[1].screenshootList[this->menuSelectedIndex+1]->setVisibility(false);
552      }
553    }
554  }
555}
556
557
558/**
559* @brief switches to from one meny layer to an other
560* @param layer1 from layer
561* @param layer2 to layer
562*/
563void SimpleGameMenu::switchMenuLayer(int layer1, int layer2)
564{
565  // wrong sizes
566  if(layer1 >= this->menuLayers.size() || layer2 >= this->menuLayers.size())
567    return;
568
569
570  PRINTF(0)("Removing layer %i\n", layer1);
571  std::vector<TextElement*>::iterator te;
572  // fade old menu
573  for( te = this->menuLayers[layer1].menuList.begin(); te != this->menuLayers[layer1].menuList.end(); te++)
574  {
575    (*te)->setVisibility(false);
576  }
577
578  std::vector<ImageEntity*>::iterator it;
579
580  //also fade the screenshots if in level choosement mode
581  for( it = this->menuLayers[layer1].screenshootList.begin(); it != this->menuLayers[layer1].screenshootList.end(); it++)
582  {
583    (*it)->setVisibility(false);
584  }
585
586
587  PRINTF(0)("Showing layer %i\n", layer1);
588  // beam here the new menu
589  for( te = this->menuLayers[layer2].menuList.begin(); te != this->menuLayers[layer2].menuList.end(); te++ )
590  {
591    (*te)->setVisibility(true);
592  }
593
594
595  this->layerIndex = layer2;
596  this->menuSelected = this->menuLayers[layer2].menuList[0];
597  this->menuSelector->setAbsCoor2D(this->menuSelected->getAbsCoor2D() + Vector2D(0, this->menuSelected->getSizeY2D() *.5));
598  this->menuSelector->setSize2D(this->menuSelected->getSizeX2D()*.7, this->menuSelected->getSizeY2D());
599  this->menuSelectedIndex = 0;
600
601  if( layer2 == 1)
602    this->menuLayers[layer2].screenshootList[0]->setVisibility(true);
603}
604
605void SimpleGameMenu::sliderTo(const Element2D* element, float bias)
606{
607  if (bias > 0.0)
608  {
609    this->menuSelector->setAbsCoorSoft2D(element->getAbsCoor2D() + Vector2D(0, element->getSizeY2D() *.5), bias);
610    this->menuSelector->setSizeSoft2D(element->getSizeX2D()*.7, element->getSizeY2D(), bias);
611  }
612  else
613  {
614    this->menuSelector->setAbsCoor2D(element->getAbsCoor2D() + Vector2D(0, element->getSizeY2D() *.5));
615    this->menuSelector->setSize2D(element->getSizeX2D()*.7, element->getSizeY2D());
616  }
617}
618
619
620
621/**********************************************************************************************
622SimpleGameMenuData
623**********************************************************************************************/
624
625
626/**
627* SimpleGameMenuData constructor
628*/
629SimpleGameMenuData::SimpleGameMenuData()
630{}
631
632/**
633* SimpleGameMenuData decontructor
634*/
635SimpleGameMenuData::~SimpleGameMenuData()
636{}
637
638
639/**
640*  initialize the GameWorldDataData
641*/
642ErrorMessage SimpleGameMenuData::init()
643{
644  /* call underlying function */
645  GameWorldData::init();
646}
647
648
649/**
650*  loads the GUI data
651* @param root reference to the xml root element
652*/
653ErrorMessage SimpleGameMenuData::loadGUI(const TiXmlElement* root)
654{
655  /* call underlying function */
656  GameWorldData::loadGUI(root);
657}
658
659
660/**
661*  unloads the GUI data
662*/
663ErrorMessage SimpleGameMenuData::unloadGUI()
664{
665  /* call underlying function */
666  GameWorldData::unloadGUI();
667}
668
669
670/**
671*  overloads the GameWorld::loadWorldEntities(...) class since the menu WorldEntity loading is different (less loading stuff)
672* @param root reference to the xml root parameter
673*/
674ErrorMessage SimpleGameMenuData::loadWorldEntities(const TiXmlElement* root)
675{
676  GameWorldData::loadWorldEntities(root);
677  /*
678  const TiXmlElement* element = root->FirstChildElement("WorldEntities");
679
680  if( element != NULL)
681  {
682  element = element->FirstChildElement();
683  PRINTF(4)("Loading WorldEntities\n");
684  while(element != NULL)
685  {
686  BaseObject* created = Factory::fabricate(element);
687  if( created != NULL )
688  printf("Created a %s: %s\n", created->getClassName(), created->getName());
689
690  if( element->Value() == "SkyBox")
691  this->sky = dynamic_cast<WorldEntity*>(created);
692  if( element->Value() == "Terrain")
693  this->terrain = dynamic_cast<Terrain*>(created);
694  element = element->NextSiblingElement();
695  }
696
697  PRINTF(4)("Done loading WorldEntities\n");
698  }
699
700  // init the pnode tree
701  PNode::getNullParent()->init();
702  */
703}
704
705
706/**
707*  unloads the world entities from the xml file
708*/
709ErrorMessage SimpleGameMenuData::unloadWorldEntities()
710{
711  /* call underlying function */
712  GameWorldData::unloadWorldEntities();
713}
714
715
716/**
717*  loads the scene data
718* @param root reference to the xml root element
719*/
720ErrorMessage SimpleGameMenuData::loadScene(const TiXmlElement* root)
721{
722  /* call underlying function */
723  GameWorldData::loadScene(root);
724}
725
726
727/**
728*  unloads the scene data
729*/
730ErrorMessage SimpleGameMenuData::unloadScene()
731{
732  /* call underlying function */
733  GameWorldData::unloadScene();
734}
735
736
737
Note: See TracBrowser for help on using the repository browser.