Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 6239 was 6222, checked in by bensch, 19 years ago

orxonox/trunk: merged the christmas branche to the trunk
merged with command:
svn merge -r6165:HEAD christmas_branche/ ../trunk/
no conflicts

File size: 18.3 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
[5915]343  // bind camera
344  playable->addChild (this->localCamera);
[4555]345
[5915]346//   //localCamera->setParent(TrackNode::getInstance());
347//  tn->addChild(this->localCamera);
[4620]348  localCamera->setClipRegion(1, 10000.0);
[6222]349//  localCamera->lookAt(playable);
[5915]350//  this->localPlayer->setParentMode(PNODE_ALL);
[5355]351  if (sky != NULL)
352  {
353    this->sky->setParent(this->localCamera);
354    this->sky->setParentMode(PNODE_MOVEMENT);
355  }
[3368]356
[6222]357  this->localCamera->getTarget()->getParent()->debugNode(0);
[4504]358  SoundEngine::getInstance()->setListener(this->localCamera);
[4176]359
[4347]360
[4709]361
[4715]362  ////////////
363  // STATIC //
364  ////////////
365
366
[4721]367//   TestEntity* testEntity = new TestEntity();
368//   testEntity->setRelCoor(Vector(570, 10, -15));
369//   testEntity->setRelDir(Quaternion(M_PI, Vector(0, 1, 0)));
370//   this->spawn(testEntity);
[4397]371
[4976]372  for(int i = 0; i < 100; i++)
373  {
[5750]374    WorldEntity* tmp = new NPCTest1();
[5049]375    char npcChar[10];
376    sprintf (npcChar, "NPC_%d", i);
[5256]377        tmp->setName(npcChar);
[5336]378    tmp->setAbsCoor(((float)rand()/RAND_MAX) * 5000, 50/*+ (float)rand()/RAND_MAX*20*/, ((float)rand()/RAND_MAX -.5) *30);
[4976]379    this->spawn(tmp);
380  }
381
[6034]382  this->music = NULL;
383  //(OggPlayer*)ResourceManager::getInstance()->load("sound/00-luke_grey_-_hypermode.ogg", OGG, RP_LEVEL);
[5211]384  //music->playback();
[4010]385}
[3365]386
[6152]387ErrorMessage World::postLoad()
388{
389  this->releaseLoadScreen();
390}
[4245]391
[6152]392
[4326]393/**
[4836]394 *  initializes a new World shortly before start
[4978]395 *
396 * this is the function, that will be loaded shortly before the world is
397 * started
[3459]398*/
[6152]399ErrorMessage World::preStart()
[3459]400{
401  this->bPause = false;
[5051]402
403  /* update the object position before game start - so there are no wrong coordinates used in the first processing */
[6074]404  PNode::getNullParent()->updateNode (0.001f);
405  PNode::getNullParent()->updateNode (0.001f);
[3459]406}
407
408
409/**
[4836]410 *  starts the World
[6150]411 */
[3459]412ErrorMessage World::start()
413{
[6151]414  this->bQuitWorld = false;
[3459]415  this->mainLoop();
416}
417
418/**
[4836]419 *  stops the world.
[3459]420
421   This happens, when the player decides to end the Level.
422*/
423ErrorMessage World::stop()
424{
[3546]425  PRINTF(3)("World::stop() - got stop signal\n");
[6151]426  this->bQuitWorld= true;
[3459]427}
428
429/**
[4836]430 *  pauses the Game
[3459]431*/
432ErrorMessage World::pause()
433{
434  this->isPaused = true;
435}
436
437/**
[4836]438 *  ends the pause Phase
[3459]439*/
440ErrorMessage World::resume()
441{
442  this->isPaused = false;
443}
444
445/**
[4836]446 *  destroys the World
[3459]447*/
448ErrorMessage World::destroy()
449{
[3566]450
[3459]451}
452
453/**
[4836]454 *  shows the loading screen
[3459]455*/
456void World::displayLoadScreen ()
457{
[4555]458  PRINTF(3)("World::displayLoadScreen - start\n");
459
460  //GLMenuImageScreen*
[4099]461  this->glmis = new GLMenuImageScreen();
[3675]462  this->glmis->setMaximum(8);
[4555]463
464  PRINTF(3)("World::displayLoadScreen - end\n");
[3459]465}
466
467/**
[6150]468 * @brief removes the loadscreen, and changes over to the game
469 *
470 * @todo take out the delay
[3459]471*/
472void World::releaseLoadScreen ()
473{
[4555]474  PRINTF(3)("World::releaseLoadScreen - start\n");
[3459]475  this->glmis->setValue(this->glmis->getMaximum());
[4555]476  PRINTF(3)("World::releaseLoadScreen - end\n");
[4099]477  delete this->glmis;
[3459]478}
479
480
[3620]481/**
[4836]482 *  this returns the current game time
483 * @returns elapsed game time
[3646]484*/
485double World::getGameTime()
486{
487  return this->gameTime;
488}
489
[3225]490
[5045]491
[2190]492/**
[4836]493 *  synchronize local data with remote data
[1855]494*/
[2636]495void World::synchronize ()
[1855]496{
[2636]497  // Get remote input
498  // Update synchronizables
[5996]499/*  NetworkManager::getInstance()->synchronize();*/
[1855]500}
[2636]501
[3459]502
[2636]503/**
[4836]504 *  run all input processing
[3225]505
506   the command node is the central input event dispatcher. the node uses the even-queue from
507   sdl and has its own event-passing-queue.
[2636]508*/
[3225]509void World::handleInput ()
[2636]510{
[4407]511  EventHandler::getInstance()->process();
512
[2636]513  // remoteinput
514}
515
[6142]516void World::tick(std::list<WorldEntity*> entityList, float dt)
517{
518  std::list<WorldEntity*>::iterator entity;
519  for (entity = entityList.begin(); entity != entityList.end(); entity++)
520    (*entity)->tick(dt);
[3459]521
[6142]522}
523
[2636]524/**
[4836]525 *  advance the timeline
[3225]526
527   this calculates the time used to process one frame (with all input handling, drawing, etc)
528   the time is mesured in ms and passed to all world-entities and other classes that need
529   a heart-beat.
[2636]530*/
[3551]531void World::tick ()
[2636]532{
533  Uint32 currentFrame = SDL_GetTicks();
534  if(!this->bPause)
535    {
[3644]536      this->dt = currentFrame - this->lastFrame;
[4555]537
[4610]538      if( this->dt > 10)
[4555]539        {
540          float fps = 1000/dt;
[3790]541
[4555]542          // temporary, only for showing how fast the text-engine is
543          char tmpChar[20];
544          sprintf(tmpChar, "fps: %4.0f", fps);
545        }
[2636]546      else
[4555]547        {
548          /* the frame-rate is limited to 100 frames per second, all other things are for
549             nothing.
550          */
[5048]551          PRINTF(3)("fps = 1000 - frame rate is adjusted\n");
[4610]552          SDL_Delay(10-dt);
[4555]553          this->dt = 10;
554        }
555
[5205]556      this->dtS = (float)this->dt / 1000.0 * this->speed;
[4145]557      this->gameTime += this->dtS;
[4833]558
[6155]559      this->tick(this->objectManager.getObjectList(OM_DEAD_TICK), this->dtS);
[6142]560      this->tick(this->objectManager.getObjectList(OM_COMMON), this->dtS);
[6155]561      this->tick(this->objectManager.getObjectList(OM_GROUP_00), this->dtS);
[6142]562      this->tick(this->objectManager.getObjectList(OM_GROUP_01), this->dtS);
563      this->tick(this->objectManager.getObjectList(OM_GROUP_01_PROJ), this->dtS);
[4010]564
[3459]565      /* update tick the rest */
[4832]566      this->localCamera->tick(this->dtS);
[4558]567      // tick the engines
[4245]568      AnimationPlayer::getInstance()->tick(this->dtS);
[4979]569//      if (this->cycle > 5)
[4558]570        PhysicsEngine::getInstance()->tick(this->dtS);
[4396]571
[4558]572      ParticleEngine::getInstance()->tick(this->dtS);
[4396]573
[4831]574
[4558]575      /** actualy the Graphics Engine should tick the world not the other way around...
[4555]576         but since we like the things not too complicated we got it this way around
577         until there is need or time to do it the other way around.
[4836]578         @todo: GraphicsEngine ticks world: separation of processes and data...
[4681]579
580        bensch: in my opinion the GraphicsEngine could draw the world, but not tick it,
581         beceause graphics have nothing(or at least not much) to do with Motion.
[4245]582      */
583      GraphicsEngine::getInstance()->tick(this->dtS);
[2636]584    }
585  this->lastFrame = currentFrame;
586}
587
[3216]588
[2636]589/**
[4836]590 *  this function gives the world a consistant state
[3551]591
592   after ticking (updating the world state) this will give a constistant
593   state to the whole system.
594*/
595void World::update()
596{
[5406]597  GraphicsEngine::getInstance()->update(this->dtS);
[6074]598  PNode::getNullParent()->updateNode (this->dtS);
[4504]599  SoundEngine::getInstance()->update();
[4978]600  //music->update();
[3551]601}
602
603
[4917]604void World::collide()
605{
[6142]606  CDEngine::getInstance()->checkCollisions(this->objectManager.getObjectList(OM_GROUP_00),
607                                            this->objectManager.getObjectList(OM_GROUP_01_PROJ));
608  CDEngine::getInstance()->checkCollisions(this->objectManager.getObjectList(OM_GROUP_01),
609                                            this->objectManager.getObjectList(OM_COMMON));
[4917]610}
611
[3551]612/**
[4836]613 *  render the current frame
[4555]614
[3225]615   clear all buffers and draw the world
[2636]616*/
617void World::display ()
618{
619  // clear buffer
620  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
621  // set camera
622  this->localCamera->apply ();
623  // draw world
624  this->draw();
625  // draw HUD
[4837]626  /** @todo draw HUD */
[2636]627  // flip buffers
[4681]628  GraphicsEngine::swapBuffers();
[3365]629  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
630  //SDL_Flip (screen);
[2636]631}
632
[2644]633
[3225]634/**
[4917]635 *  runs through all entities calling their draw() methods
636 */
637void World::draw ()
638{
[6142]639  GraphicsEngine* engine = GraphicsEngine::getInstance();
640  engine->draw(State::getObjectManager()->getObjectList(OM_ENVIRON_NOTICK));
641  engine->draw(State::getObjectManager()->getObjectList(OM_ENVIRON));
642  engine->draw(State::getObjectManager()->getObjectList(OM_COMMON));
643  engine->draw(State::getObjectManager()->getObjectList(OM_GROUP_00));
644  engine->draw(State::getObjectManager()->getObjectList(OM_GROUP_01));
645  engine->draw(State::getObjectManager()->getObjectList(OM_GROUP_01_PROJ));
[4917]646
[6142]647//   {
648//     if( entity->isVisible() ) entity->draw();
649  //FIXME
650//     if( unlikely( this->showBV)) entity->drawBVTree(3, 226);  // to draw the bounding boxes of the objects at level 2 for debug purp
651//     entity = iterator->nextElement();
652//   }
653
[4917]654  ParticleEngine::getInstance()->draw();
655
[5389]656  if (unlikely(this->showPNodes))
[6074]657    PNode::getNullParent()->debugDraw(0);
[5389]658
[6142]659  engine->draw();
[4917]660  //TextEngine::getInstance()->draw();
661}
662
[2816]663
[3225]664/**
[6150]665 * \brief main loop of the world: executing all world relevant function
666 *
667 * in this loop we synchronize (if networked), handle input events, give the heart-beat to
668 * all other member-entities of the world (tick to player, enemies etc.), checking for
669 * collisions drawing everything to the screen.
670 */
671void World::mainLoop()
[2816]672{
[6150]673  this->lastFrame = SDL_GetTicks ();
674  PRINTF(3)("World::mainLoop() - Entering main loop\n");
[3529]675
[6151]676  while(!this->bQuitWorld) /* @todo implement pause */
[6150]677  {
678    ++this->cycle;
679      // Network
680    this->synchronize ();
681      // Process input
682    this->handleInput ();
[6151]683    if( this->bQuitWorld)
[6150]684      break;
685      // Process time
686    this->tick ();
687      // Process collision
688    this->collide ();
689      // Update the state
690    this->update ();
691      // Draw
692    this->display ();
693  }
[3365]694
[6150]695  PRINTF(3)("World::mainLoop() - Exiting the main loop\n");
[2644]696}
[2816]697
698
[6150]699
[3521]700/**
[4836]701 *  add and spawn a new entity to this world
702 * @param entity to be added
[3521]703*/
[6150]704void World::spawn(WorldEntity* entity)
[3521]705{
[6150]706//   this->entities->add (entity);
707  entity->postSpawn ();
[3521]708}
709
[4010]710void World::setPath( const char* name)
711{
[4094]712  if (this->path)
713    delete this->path;
714  if (ResourceManager::isFile(name))
715  {
716    this->path = new char[strlen(name)+1];
717    strcpy(this->path, name);
718  }
719  else
720    {
721      this->path = new char[strlen(ResourceManager::getInstance()->getDataDir()) + strlen(name) +1];
722      sprintf(this->path, "%s%s", ResourceManager::getInstance()->getDataDir(), name);
723    }
[4010]724}
725
726const char* World::getPath( void)
727{
728  return path;
729}
Note: See TracBrowser for help on using the repository browser.