Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/story_entities/world.cc @ 6316

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

orxonox/trunk: now painting the BV's again…. no error due to my change in the static model…. puh :)

File size: 18.6 KB
RevLine 
[4555]1/*
[1853]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.
[1855]10
11   ### File Specific:
12   main-programmer: Patrick Boenzli
[2190]13   co-programmer: Christian Meyer
[5390]14   co-programmer: Benjamin Grauer
[1853]15*/
16
[3590]17#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD
18
[2190]19#include "world.h"
[3608]20
[5205]21#include "shell_command.h"
[6150]22#include "resource_manager.h"
[4347]23#include "state.h"
24
[3608]25#include "p_node.h"
[2190]26#include "world_entity.h"
[2036]27#include "player.h"
[2190]28#include "camera.h"
[2816]29#include "environment.h"
[6151]30#include "terrain.h"
[6150]31
[4245]32#include "test_entity.h"
[3608]33#include "terrain.h"
[3436]34#include "light.h"
[4726]35#include "load_param.h"
[5174]36#include "shell.h"
[3620]37
[4940]38#include "fast_factory.h"
[3812]39#include "animation_player.h"
[4176]40#include "particle_engine.h"
[4245]41#include "graphics_engine.h"
[4338]42#include "physics_engine.h"
[4396]43#include "fields.h"
[3646]44
[4488]45#include "md2Model.h"
46
[3608]47#include "glmenu_imagescreen.h"
[4010]48#include "game_loader.h"
[2036]49
[3964]50#include "animation3d.h"
[3608]51
[4010]52#include "substring.h"
[3608]53
[4261]54#include "factory.h"
[4245]55
[5556]56#include "weapons/projectile.h"
[4405]57#include "event_handler.h"
[4504]58#include "sound_engine.h"
[4961]59#include "ogg_player.h"
[4504]60
[4747]61#include "class_list.h"
62
[4917]63#include "cd_engine.h"
[5750]64#include "npcs/npc_test1.h"
[5318]65#include "shader.h"
[4820]66
[5915]67#include "playable.h"
[5996]68#include "network_manager.h"
69#include "playable.h"
[5915]70
[5996]71
[5205]72SHELL_COMMAND(speed, World, setSpeed);
[5389]73SHELL_COMMAND(togglePNodeVisibility, World, togglePNodeVisibility);
[5429]74SHELL_COMMAND(toggleBVVisibility, World, toggleBVVisibility);
[5205]75
[1856]76using namespace std;
[1853]77
[4978]78//! This creates a Factory to fabricate a World
[5750]79CREATE_FACTORY(World, CL_WORLD);
[3620]80
[4261]81World::World(const TiXmlElement* root)
[4010]82{
83  this->constuctorInit("", -1);
[4094]84  this->path = NULL;
[4555]85
[4261]86  this->loadParams(root);
[4010]87}
88
[4555]89/**
[4838]90 *  remove the World from memory
[6150]91 *
92 *  delete everything explicitly, that isn't contained in the parenting tree!
93 *  things contained in the tree are deleted automaticaly
[4838]94 */
[2190]95World::~World ()
[1872]96{
[5206]97  delete this->shell;
[3546]98  PRINTF(3)("World::~World() - deleting current world\n");
[3677]99
[5915]100  delete this->localPlayer;
[5115]101
[5296]102  // delete all the initialized Engines.
[5447]103  FastFactory::flushAll(true);
[4735]104  delete LightManager::getInstance();
[4822]105  delete ParticleEngine::getInstance();
[5296]106  delete AnimationPlayer::getInstance();
[4978]107  delete PhysicsEngine::getInstance();
[4822]108
[4978]109  // external engines initialized by the orxonox-class get deleted
[4504]110  SoundEngine::getInstance()->flushAllBuffers();
[4830]111  SoundEngine::getInstance()->flushAllSources();
[4504]112
[6142]113  if (State::getObjectManager() == &this->objectManager)
114    State::setObjectManager(NULL);
[4978]115  // erease everything that is left.
[6074]116  delete PNode::getNullParent();
[5915]117
[6054]118  //secondary cleanup of PNodes;
119  const std::list<BaseObject*>* nodeList = ClassList::getList(CL_PARENT_NODE);
120  if (nodeList != NULL)
121    while (!nodeList->empty())
122      delete nodeList->front();
123
[5318]124  Shader::suspendShader();
[4872]125
[4978]126  // unload the resources !!
[4136]127  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
[1872]128}
[1858]129
[3526]130/**
[4978]131 * initializes the world.
132 * @param name the name of the world
133 * @param worldID the ID of this world
134 *
135 * set all stuff here that is world generic and does not use to much memory
136 * because the real init() function StoryEntity::init() will be called
137 * shortly before start of the game.
138 * since all worlds are initiated/referenced before they will be started.
139 * NO LEVEL LOADING HERE - NEVER!
[3526]140*/
[4978]141void World::constuctorInit(const char* name, int worldID)
[3526]142{
[4320]143  this->setClassID(CL_WORLD, "World");
[2636]144
[4978]145  this->setName(name);
[5211]146  this->gameTime = 0.0f;
[5205]147  this->setSpeed(1.0);
[4961]148  this->music = NULL;
[5211]149  this->shell = NULL;
[5915]150  this->localPlayer = NULL;
151  this->localCamera = NULL;
[5389]152
153  this->showPNodes = false;
[5429]154  this->showBV = false;
[3629]155}
[3526]156
[4978]157/**
158 * loads the parameters of a World from an XML-element
159 * @param root the XML-element to load from
160 */
[4261]161void World::loadParams(const TiXmlElement* root)
162{
[4600]163  PRINTF(4)("Creating a World\n");
[4261]164
[5671]165  LoadParam(root, "identifier", this, World, setStoryID)
[4261]166    .describe("Sets the StoryID of this world");
[4834]167
[5671]168  LoadParam(root, "nextid", this, World, setNextStoryID)
[4261]169    .describe("Sets the ID of the next world");
[4834]170
[5671]171  LoadParam(root, "path", this, World, setPath)
[4261]172    .describe("The Filename of this World (relative from the data-dir)");
173}
174
[3629]175/**
[4978]176 * this is executed just before load
177 *
178 * since the load function sometimes needs data, that has been initialized
179 * before the load and after the proceeding storyentity has finished
[3629]180*/
181ErrorMessage World::preLoad()
182{
[6142]183  State::setObjectManager(&this->objectManager);
[4829]184  this->cycle = 0;
185
[3620]186  /* init the world interface */
[5206]187  this->shell = new Shell();
[4010]188
[4735]189  LightManager::getInstance();
[6074]190  PNode::getNullParent();
[3993]191
[4010]192  AnimationPlayer::getInstance(); // initializes the animationPlayer
[5915]193  ParticleEngine::getInstance();
[4338]194  PhysicsEngine::getInstance();
[4010]195
[4015]196  this->localCamera = new Camera();
[4978]197  this->localCamera->setName ("World-Camera");
[4555]198
[4827]199  State::setCamera(this->localCamera, this->localCamera->getTarget());
[4347]200
[4245]201  GraphicsEngine::getInstance()->displayFPS(true);
[6152]202  this->displayLoadScreen();
[3526]203}
204
205
[3449]206/**
[4836]207 *  loads the World by initializing all resources, and set their default values.
[6150]208 */
[3459]209ErrorMessage World::load()
[4555]210{
[4104]211  PRINTF(3)("> Loading world: '%s'\n", getPath());
212  TiXmlElement* element;
[4010]213  GameLoader* loader = GameLoader::getInstance();
[4555]214
[4010]215  if( getPath() == NULL)
[2636]216    {
[4104]217      PRINTF(1)("World has no path specified for loading");
[4010]218      return (ErrorMessage){213,"Path not specified","World::load()"};
219    }
[4555]220
[5915]221  TiXmlDocument* XMLDoc = new TiXmlDocument( getPath());
[4010]222  // load the campaign document
[4555]223  if( !XMLDoc->LoadFile())
[4010]224  {
225    // report an error
[5915]226    PRINTF(1)("loading XML File: %s @ %s:l%d:c%d\n", XMLDoc->ErrorDesc(), this->getPath(), XMLDoc->ErrorRow(), XMLDoc->ErrorCol());
[4010]227    delete XMLDoc;
228    return (ErrorMessage){213,"XML File parsing error","World::load()"};
229  }
[4555]230
[4010]231  // check basic validity
232  TiXmlElement* root = XMLDoc->RootElement();
233  assert( root != NULL);
[4555]234
[4010]235  if( root == NULL || root->Value() == NULL || strcmp( root->Value(), "WorldDataFile"))
236    {
237      // report an error
[4104]238      PRINTF(1)("Specified XML File is not an orxonox world data file (WorldDataFile element missing)\n");
[4010]239      delete XMLDoc;
240      return (ErrorMessage){213,"Path not a WorldDataFile","World::load()"};
241    }
[4555]242
[4010]243  // load the parameters
244  // name
245  const char* string = grabParameter( root, "name");
246  if( string == NULL)
247    {
[4104]248      PRINTF(2)("World is missing a proper 'name'\n");
[5211]249      this->setName("Unknown");
[4010]250    }
251  else
252    {
[5211]253      this->setName(string);
[4010]254    }
[4978]255
[4104]256  ////////////////
257  // LOADSCREEN //
258  ////////////////
259  element = root->FirstChildElement("LoadScreen");
260  if (element == NULL)
261    {
262      PRINTF(2)("no LoadScreen specified, loading default\n");
263
264      glmis->setBackgroundImage("pictures/load_screen.jpg");
265      this->glmis->setMaximum(8);
266      this->glmis->draw();
267    }
268  else
269    {
[4261]270      this->glmis->loadParams(element);
[4104]271      this->glmis->draw();
272    }
273  this->glmis->draw();
[4726]274
275  ////////////////////////
276  // find WorldEntities //
277  ////////////////////////
278
[4104]279  element = root->FirstChildElement("WorldEntities");
[4555]280
[4010]281  if( element == NULL)
282    {
[4104]283      PRINTF(1)("World is missing 'WorldEntities'\n");
[4010]284    }
285  else
286    {
287      element = element->FirstChildElement();
288      // load Players/Objects/Whatever
[4104]289      PRINTF(4)("Loading WorldEntities\n");
[4010]290      while( element != NULL)
[4555]291        {
[5996]292          BaseObject* created = Factory::fabricate(element);
[5915]293          if( created != NULL )
294          {
295            if(created->isA(CL_WORLD_ENTITY))
296              this->spawn(dynamic_cast<WorldEntity*>(created));
[5996]297            printf("Created a %s: %s\n", created->getClassName(), created->getName());
[5915]298          }
299
[4555]300          // if we load a 'Player' we use it as localPlayer
[5915]301
302
[4555]303          //todo do this more elegant
[5915]304          if( element->Value() != NULL && !strcmp( element->Value(), "SkyBox"))
[6150]305            this->sky = dynamic_cast<WorldEntity*>(created);
[4918]306          if( element->Value() != NULL && !strcmp( element->Value(), "Terrain"))
307          {
[5915]308            terrain = dynamic_cast<Terrain*>(created);
[4918]309            CDEngine::getInstance()->setTerrain(terrain);
310          }
[4555]311          element = element->NextSiblingElement();
[4836]312          glmis->step(); //! @todo temporary
[4555]313        }
[4104]314      PRINTF(4)("Done loading WorldEntities\n");
[4010]315    }
[4555]316
[4726]317    //////////////////////////////
318    // LOADING ADDITIONAL STUFF //
319    //////////////////////////////
320
[5652]321    LoadParamXML(root, "LightManager", LightManager::getInstance(), LightManager, loadParams);
[4735]322
[5915]323   LoadParamXML(root, "ParticleEngine", ParticleEngine::getInstance(), ParticleEngine, loadParams);
324//   LoadParamXML(root, "PhysicsEngine", PhysicsEngine::getInstance(), PhysicsEngine, loadParams);
[4726]325
[4010]326  // free the XML data
[4015]327
[4010]328  delete XMLDoc;
[4015]329  /* GENERIC LOADING PROCESS FINISHED */
[4555]330
331
[5915]332  // Create a Player
333  this->localPlayer = new Player();
[4245]334
[5915]335  Playable* playable;
336  const list<BaseObject*>* playableList = ClassList::getList(CL_PLAYABLE);
337  if (playableList != NULL)
338  {
339    playable = dynamic_cast<Playable*>(playableList->front());
340    this->localPlayer->setControllable(playable);
341  }
[4555]342
343
[5915]344//   //localCamera->setParent(TrackNode::getInstance());
345//  tn->addChild(this->localCamera);
[4620]346  localCamera->setClipRegion(1, 10000.0);
[6222]347//  localCamera->lookAt(playable);
[5915]348//  this->localPlayer->setParentMode(PNODE_ALL);
[6241]349  if (this->sky != NULL)
[5355]350  {
[6307]351    this->localCamera->addChild(sky);
[5355]352  }
[4504]353  SoundEngine::getInstance()->setListener(this->localCamera);
[4176]354
[4347]355
[4709]356
[4715]357  ////////////
358  // STATIC //
359  ////////////
360
361
[4721]362//   TestEntity* testEntity = new TestEntity();
363//   testEntity->setRelCoor(Vector(570, 10, -15));
364//   testEntity->setRelDir(Quaternion(M_PI, Vector(0, 1, 0)));
365//   this->spawn(testEntity);
[4397]366
[4976]367  for(int i = 0; i < 100; i++)
368  {
[5750]369    WorldEntity* tmp = new NPCTest1();
[5049]370    char npcChar[10];
371    sprintf (npcChar, "NPC_%d", i);
[5256]372        tmp->setName(npcChar);
[5336]373    tmp->setAbsCoor(((float)rand()/RAND_MAX) * 5000, 50/*+ (float)rand()/RAND_MAX*20*/, ((float)rand()/RAND_MAX -.5) *30);
[4976]374    this->spawn(tmp);
375  }
376
[6034]377  this->music = NULL;
378  //(OggPlayer*)ResourceManager::getInstance()->load("sound/00-luke_grey_-_hypermode.ogg", OGG, RP_LEVEL);
[5211]379  //music->playback();
[4010]380}
[3365]381
[6152]382ErrorMessage World::postLoad()
383{
384  this->releaseLoadScreen();
385}
[4245]386
[6152]387
[4326]388/**
[4836]389 *  initializes a new World shortly before start
[4978]390 *
391 * this is the function, that will be loaded shortly before the world is
392 * started
[3459]393*/
[6152]394ErrorMessage World::preStart()
[3459]395{
396  this->bPause = false;
[5051]397
398  /* update the object position before game start - so there are no wrong coordinates used in the first processing */
[6074]399  PNode::getNullParent()->updateNode (0.001f);
400  PNode::getNullParent()->updateNode (0.001f);
[3459]401}
402
403
404/**
[4836]405 *  starts the World
[6150]406 */
[3459]407ErrorMessage World::start()
408{
[6151]409  this->bQuitWorld = false;
[3459]410  this->mainLoop();
411}
412
413/**
[4836]414 *  stops the world.
[3459]415
416   This happens, when the player decides to end the Level.
417*/
418ErrorMessage World::stop()
419{
[3546]420  PRINTF(3)("World::stop() - got stop signal\n");
[6151]421  this->bQuitWorld= true;
[3459]422}
423
424/**
[4836]425 *  pauses the Game
[3459]426*/
427ErrorMessage World::pause()
428{
429  this->isPaused = true;
430}
431
432/**
[4836]433 *  ends the pause Phase
[3459]434*/
435ErrorMessage World::resume()
436{
437  this->isPaused = false;
438}
439
440/**
[4836]441 *  destroys the World
[3459]442*/
443ErrorMessage World::destroy()
444{
[3566]445
[3459]446}
447
448/**
[4836]449 *  shows the loading screen
[3459]450*/
451void World::displayLoadScreen ()
452{
[4555]453  PRINTF(3)("World::displayLoadScreen - start\n");
454
455  //GLMenuImageScreen*
[4099]456  this->glmis = new GLMenuImageScreen();
[3675]457  this->glmis->setMaximum(8);
[4555]458
459  PRINTF(3)("World::displayLoadScreen - end\n");
[3459]460}
461
462/**
[6150]463 * @brief removes the loadscreen, and changes over to the game
464 *
465 * @todo take out the delay
[3459]466*/
467void World::releaseLoadScreen ()
468{
[4555]469  PRINTF(3)("World::releaseLoadScreen - start\n");
[3459]470  this->glmis->setValue(this->glmis->getMaximum());
[4555]471  PRINTF(3)("World::releaseLoadScreen - end\n");
[4099]472  delete this->glmis;
[3459]473}
474
475
[3620]476/**
[4836]477 *  this returns the current game time
478 * @returns elapsed game time
[3646]479*/
480double World::getGameTime()
481{
482  return this->gameTime;
483}
484
[3225]485
[5045]486
[2190]487/**
[4836]488 *  synchronize local data with remote data
[1855]489*/
[2636]490void World::synchronize ()
[1855]491{
[2636]492  // Get remote input
493  // Update synchronizables
[5996]494/*  NetworkManager::getInstance()->synchronize();*/
[1855]495}
[2636]496
[3459]497
[2636]498/**
[4836]499 *  run all input processing
[3225]500
501   the command node is the central input event dispatcher. the node uses the even-queue from
502   sdl and has its own event-passing-queue.
[2636]503*/
[3225]504void World::handleInput ()
[2636]505{
[4407]506  EventHandler::getInstance()->process();
507
[2636]508  // remoteinput
509}
510
[6142]511void World::tick(std::list<WorldEntity*> entityList, float dt)
512{
513  std::list<WorldEntity*>::iterator entity;
514  for (entity = entityList.begin(); entity != entityList.end(); entity++)
515    (*entity)->tick(dt);
[3459]516
[6142]517}
518
[2636]519/**
[4836]520 *  advance the timeline
[3225]521
522   this calculates the time used to process one frame (with all input handling, drawing, etc)
523   the time is mesured in ms and passed to all world-entities and other classes that need
524   a heart-beat.
[2636]525*/
[3551]526void World::tick ()
[2636]527{
528  Uint32 currentFrame = SDL_GetTicks();
529  if(!this->bPause)
530    {
[3644]531      this->dt = currentFrame - this->lastFrame;
[4555]532
[4610]533      if( this->dt > 10)
[4555]534        {
535          float fps = 1000/dt;
[3790]536
[4555]537          // temporary, only for showing how fast the text-engine is
538          char tmpChar[20];
539          sprintf(tmpChar, "fps: %4.0f", fps);
540        }
[2636]541      else
[4555]542        {
543          /* the frame-rate is limited to 100 frames per second, all other things are for
544             nothing.
545          */
[5048]546          PRINTF(3)("fps = 1000 - frame rate is adjusted\n");
[4610]547          SDL_Delay(10-dt);
[4555]548          this->dt = 10;
549        }
550
[5205]551      this->dtS = (float)this->dt / 1000.0 * this->speed;
[4145]552      this->gameTime += this->dtS;
[4833]553
[6155]554      this->tick(this->objectManager.getObjectList(OM_DEAD_TICK), this->dtS);
[6142]555      this->tick(this->objectManager.getObjectList(OM_COMMON), this->dtS);
[6155]556      this->tick(this->objectManager.getObjectList(OM_GROUP_00), this->dtS);
[6142]557      this->tick(this->objectManager.getObjectList(OM_GROUP_01), this->dtS);
558      this->tick(this->objectManager.getObjectList(OM_GROUP_01_PROJ), this->dtS);
[4010]559
[3459]560      /* update tick the rest */
[4832]561      this->localCamera->tick(this->dtS);
[4558]562      // tick the engines
[4245]563      AnimationPlayer::getInstance()->tick(this->dtS);
[4979]564//      if (this->cycle > 5)
[4558]565        PhysicsEngine::getInstance()->tick(this->dtS);
[4396]566
[4558]567      ParticleEngine::getInstance()->tick(this->dtS);
[4396]568
[4831]569
[4558]570      /** actualy the Graphics Engine should tick the world not the other way around...
[4555]571         but since we like the things not too complicated we got it this way around
572         until there is need or time to do it the other way around.
[4836]573         @todo: GraphicsEngine ticks world: separation of processes and data...
[4681]574
575        bensch: in my opinion the GraphicsEngine could draw the world, but not tick it,
576         beceause graphics have nothing(or at least not much) to do with Motion.
[4245]577      */
578      GraphicsEngine::getInstance()->tick(this->dtS);
[2636]579    }
580  this->lastFrame = currentFrame;
581}
582
[3216]583
[2636]584/**
[4836]585 *  this function gives the world a consistant state
[3551]586
587   after ticking (updating the world state) this will give a constistant
588   state to the whole system.
589*/
590void World::update()
591{
[5406]592  GraphicsEngine::getInstance()->update(this->dtS);
[6074]593  PNode::getNullParent()->updateNode (this->dtS);
[4504]594  SoundEngine::getInstance()->update();
[4978]595  //music->update();
[3551]596}
597
598
[4917]599void World::collide()
600{
[6142]601  CDEngine::getInstance()->checkCollisions(this->objectManager.getObjectList(OM_GROUP_00),
602                                            this->objectManager.getObjectList(OM_GROUP_01_PROJ));
603  CDEngine::getInstance()->checkCollisions(this->objectManager.getObjectList(OM_GROUP_01),
604                                            this->objectManager.getObjectList(OM_COMMON));
[4917]605}
606
[3551]607/**
[4836]608 *  render the current frame
[4555]609
[3225]610   clear all buffers and draw the world
[2636]611*/
612void World::display ()
613{
614  // clear buffer
615  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
616  // set camera
617  this->localCamera->apply ();
618  // draw world
619  this->draw();
620  // draw HUD
[4837]621  /** @todo draw HUD */
[2636]622  // flip buffers
[4681]623  GraphicsEngine::swapBuffers();
[3365]624  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
625  //SDL_Flip (screen);
[2636]626}
627
[2644]628
[3225]629/**
[4917]630 *  runs through all entities calling their draw() methods
631 */
632void World::draw ()
633{
[6142]634  GraphicsEngine* engine = GraphicsEngine::getInstance();
635  engine->draw(State::getObjectManager()->getObjectList(OM_ENVIRON_NOTICK));
636  engine->draw(State::getObjectManager()->getObjectList(OM_ENVIRON));
637  engine->draw(State::getObjectManager()->getObjectList(OM_COMMON));
638  engine->draw(State::getObjectManager()->getObjectList(OM_GROUP_00));
639  engine->draw(State::getObjectManager()->getObjectList(OM_GROUP_01));
640  engine->draw(State::getObjectManager()->getObjectList(OM_GROUP_01_PROJ));
[4917]641
[6316]642   if( unlikely( this->showBV))  // to draw the bounding boxes of the objects at level 2 for debug purp
643   {
644     CDEngine* engine = CDEngine::getInstance();
645     engine->drawBV(State::getObjectManager()->getObjectList(OM_ENVIRON_NOTICK));
646     engine->drawBV(State::getObjectManager()->getObjectList(OM_ENVIRON));
647     engine->drawBV(State::getObjectManager()->getObjectList(OM_COMMON));
648     engine->drawBV(State::getObjectManager()->getObjectList(OM_GROUP_00));
649     engine->drawBV(State::getObjectManager()->getObjectList(OM_GROUP_01));
650     engine->drawBV(State::getObjectManager()->getObjectList(OM_GROUP_01_PROJ));
651   }
652
[6142]653//   {
654//     if( entity->isVisible() ) entity->draw();
655  //FIXME
656//     entity = iterator->nextElement();
657//   }
658
[4917]659  ParticleEngine::getInstance()->draw();
660
[5389]661  if (unlikely(this->showPNodes))
[6074]662    PNode::getNullParent()->debugDraw(0);
[5389]663
[6142]664  engine->draw();
[4917]665  //TextEngine::getInstance()->draw();
666}
667
[2816]668
[3225]669/**
[6150]670 * \brief main loop of the world: executing all world relevant function
671 *
672 * in this loop we synchronize (if networked), handle input events, give the heart-beat to
673 * all other member-entities of the world (tick to player, enemies etc.), checking for
674 * collisions drawing everything to the screen.
675 */
676void World::mainLoop()
[2816]677{
[6150]678  this->lastFrame = SDL_GetTicks ();
679  PRINTF(3)("World::mainLoop() - Entering main loop\n");
[3529]680
[6151]681  while(!this->bQuitWorld) /* @todo implement pause */
[6150]682  {
683    ++this->cycle;
684      // Network
685    this->synchronize ();
686      // Process input
687    this->handleInput ();
[6151]688    if( this->bQuitWorld)
[6150]689      break;
690      // Process time
691    this->tick ();
692      // Process collision
693    this->collide ();
694      // Update the state
695    this->update ();
696      // Draw
697    this->display ();
698  }
[3365]699
[6150]700  PRINTF(3)("World::mainLoop() - Exiting the main loop\n");
[2644]701}
[2816]702
703
[6150]704
[3521]705/**
[4836]706 *  add and spawn a new entity to this world
707 * @param entity to be added
[3521]708*/
[6150]709void World::spawn(WorldEntity* entity)
[3521]710{
[6150]711//   this->entities->add (entity);
712  entity->postSpawn ();
[3521]713}
714
[4010]715void World::setPath( const char* name)
716{
[4094]717  if (this->path)
718    delete this->path;
719  if (ResourceManager::isFile(name))
720  {
721    this->path = new char[strlen(name)+1];
722    strcpy(this->path, name);
723  }
724  else
725    {
726      this->path = new char[strlen(ResourceManager::getInstance()->getDataDir()) + strlen(name) +1];
727      sprintf(this->path, "%s%s", ResourceManager::getInstance()->getDataDir(), name);
728    }
[4010]729}
730
731const char* World::getPath( void)
732{
733  return path;
734}
Note: See TracBrowser for help on using the repository browser.