Index: trunk/src/story_entities/game_world.cc
===================================================================
--- trunk/src/story_entities/game_world.cc	(revision 7126)
+++ trunk/src/story_entities/game_world.cc	(revision 7131)
@@ -124,5 +124,4 @@
 ErrorMessage GameWorld::init()
 {
-  this->cycle = 0;
   /* init the world interface */
   this->shell = new Shell();
@@ -248,6 +247,12 @@
     this->dataTank->music->playback();
 
+  PRINTF(3)("GameWorld::mainLoop() - Entering main loop\n");
+
+  // initialize Timing
+  this->cycle = 0;
+  for (unsigned int i = 0; i < TICK_SMOOTH_VALUE; i++)
+    this->frameTimes[i] = 0;
+  this->dtS = 0.0f;
   this->lastFrame = SDL_GetTicks ();
-  PRINTF(3)("GameWorld::mainLoop() - Entering main loop\n");
 
   while( this->isRunning) /* @todo implement pause */
@@ -310,4 +315,5 @@
 }
 
+
 /**
  *  advance the timeline
@@ -323,18 +329,27 @@
   if( !this->isPaused)
   {
-    this->dt = currentFrame - this->lastFrame;
-
-    /* limit the the frame rate to 100 frames per second (fps) */
-    if( this->dt < 10)
-    {
-      /* the frame-rate is limited to 100 frames per second, all other things are for nothing. */
-      //PRINTF(0)("fps = 1000 - frame rate is adjusted\n");
-      SDL_Delay(10 - dt);
-      this->dt = 10;
-    }
-
-    this->dtS = (float)this->dt / 1000.0f * this->speed;
-    this->gameTime += this->dtS;
-
+    // CALCULATE FRAMERATE
+    Uint32 frameTimesIndex;
+    Uint32 getTicks;
+    Uint32 count;
+    Uint32 i;
+
+    frameTimesIndex = this->cycle % TICK_SMOOTH_VALUE;
+    getTicks = SDL_GetTicks();
+    this->frameTimes[frameTimesIndex] = getTicks - this->lastFrame;
+    this->lastFrame = getTicks;
+    //this->cycle++;
+  // Work out the current framerate
+    if (this->cycle < TICK_SMOOTH_VALUE)
+      count = this->cycle;
+    else
+      count = TICK_SMOOTH_VALUE;
+        // add up all the values and divide to get the average frame time.
+    this->dtS = 0;
+    for (i = 0; i < count; i++)
+      this->dtS += this->frameTimes[i];
+    this->dtS = this->dtS / count / 1000.0f * speed;
+
+    // TICK everything
     this->tick(this->dataTank->objectManager->getObjectList(OM_DEAD_TICK), this->dtS);
     this->tick(this->dataTank->objectManager->getObjectList(OM_ENVIRON), this->dtS);
Index: trunk/src/story_entities/game_world.h
===================================================================
--- trunk/src/story_entities/game_world.h	(revision 7126)
+++ trunk/src/story_entities/game_world.h	(revision 7131)
@@ -11,9 +11,12 @@
 #include "game_world_data.h"
 
-class TiXmlElement;
 class Shell;
 class WorldEntity;
-class GameWorldData;
 
+/** How many frames time values to keep
+ * The higher the value the smoother the result is...
+ * Don't make it 0 or less :)
+ */
+#define TICK_SMOOTH_VALUE 10
 
 //! The game world
@@ -82,10 +85,11 @@
 
     /* world timing */
-    Uint32              lastFrame;                    //!< last time of frame
+    Uint32              lastFrame;                    //!< last time of frame (in MiliSeconds)
     Uint32              cycle;                        //!< The cycle we are in (starts with 0 and rises with every frame)
-    Uint32              dt;                           //!< time needed to calculate this frame (in milliSeconds)
     float               dtS;                          //!< The time needed for caluculations in seconds
     float               speed;                        //!< how fast the game flows
     double              gameTime;                     //!< this is where the game time is saved
+    Uint32              frameTimes[TICK_SMOOTH_VALUE];//!< The time used for the last TICK_SMOOTH_VALUE's frames.
+
 
     /* external modules interfaces */
Index: trunk/src/story_entities/simple_game_menu.cc
===================================================================
--- trunk/src/story_entities/simple_game_menu.cc	(revision 7126)
+++ trunk/src/story_entities/simple_game_menu.cc	(revision 7131)
@@ -296,5 +296,5 @@
   GameWorld::tick();
 
-  this->animateScene(this->dt);
+  this->animateScene(this->dtS);
 }
 
@@ -314,5 +314,5 @@
 void SimpleGameMenu::animateScene(float dt)
 {
-  Quaternion q(/*0.00005*/ 0.0001* dt, Vector(0.0, 1.0, 0.0));
+  Quaternion q(/*0.00005*/ dt * .1, Vector(0.0, 1.0, 0.0));
   this->cameraVector = q.apply(this->cameraVector);
   this->dataTank->localCamera->setRelCoor(this->cameraVector);
