- made some changes for joystick in menu. better?
[supertux.git] / src / world.cpp
index 11bc77c..97edbeb 100644 (file)
@@ -59,13 +59,13 @@ World::World(const std::string& filename)
   get_level()->load_gfx();
   // add background
   activate_particle_systems();
-  Background* bg = new Background(displaymanager);
+  background = new Background(displaymanager);
   if(level->img_bkgd) {
-    bg->set_image(level->img_bkgd, level->bkgd_speed);
+    background->set_image(level->img_bkgd, level->bkgd_speed);
   } else {
-    bg->set_gradient(level->bkgd_top, level->bkgd_bottom);
+    background->set_gradient(level->bkgd_top, level->bkgd_bottom);
   }
-  gameobjects.push_back(bg);
+  gameobjects.push_back(background);
 
   // add tilemap
   gameobjects.push_back(new TileMap(displaymanager, get_level()));
@@ -92,13 +92,13 @@ World::World(const std::string& subset, int level_nr)
 
   get_level()->load_gfx();
   activate_particle_systems();
-  Background* bg = new Background(displaymanager);
+  background = new Background(displaymanager);
   if(level->img_bkgd) {
-    bg->set_image(level->img_bkgd, level->bkgd_speed);
+    background->set_image(level->img_bkgd, level->bkgd_speed);
   } else {
-    bg->set_gradient(level->bkgd_top, level->bkgd_bottom);
+    background->set_gradient(level->bkgd_top, level->bkgd_bottom);
   }
-  gameobjects.push_back(bg);
+  gameobjects.push_back(background);
   // add tilemap
   gameobjects.push_back(new TileMap(displaymanager, get_level()));  
   get_level()->load_song();
@@ -129,17 +129,10 @@ World::apply_bonuses()
 
 World::~World()
 {
-  for (Trampolines::iterator i = trampolines.begin(); i != trampolines.end(); ++i)
-    delete *i;
-
   for (std::vector<GameObject*>::iterator i = gameobjects.begin();
           i != gameobjects.end(); ++i) {
-    Drawable* drawable = dynamic_cast<Drawable*> (*i);
-    if(drawable)
-      displaymanager.remove_drawable(drawable);
     delete *i;
   }
-  bad_guys.clear();
 
   delete level;
 }
@@ -147,9 +140,6 @@ World::~World()
 void
 World::set_defaults()
 {
-  // Set defaults: 
-  scroll_x = 0;
-
   player_status.score_multiplier = 1;
 
   counting_distros = false;
@@ -220,21 +210,21 @@ void
 World::draw()
 {
   /* Draw objects */
-  displaymanager.get_viewport().set_translation(Vector(scroll_x, scroll_y));
   displaymanager.draw();
 }
 
 void
-World::action(double frame_ratio)
+World::action(float elapsed_time)
 {
-  tux->check_bounds(level->back_scrolling, (bool)level->hor_autoscroll_speed);
-  scrolling(frame_ratio);
-
   /* update objects (don't use iterators here, because the list might change
    * during the iteration)
    */
   for(size_t i = 0; i < gameobjects.size(); ++i)
-    gameobjects[i]->action(frame_ratio);
+    gameobjects[i]->action(elapsed_time);
+
+  tux->check_bounds(displaymanager.get_viewport(),
+      level->back_scrolling, (bool)level->hor_autoscroll_speed);
+  scrolling(elapsed_time);                                                      
 
   /* Handle all possible collisions. */
   collision_handler();
@@ -289,8 +279,11 @@ World::action(double frame_ratio)
 #define CHANGE_DIR_SCROLL_SPEED 2000
 
 /* This functions takes cares of the scrolling */
-void World::scrolling(double frame_ratio)
+void World::scrolling(float elapsed_time)
 {
+  float scroll_x = displaymanager.get_viewport().get_translation().x;
+  float scroll_y = displaymanager.get_viewport().get_translation().y;
+  
   /* Y-axis scrolling */
 
   float tux_pos_y = tux->base.y + (tux->base.height/2);
@@ -314,7 +307,8 @@ void World::scrolling(double frame_ratio)
   /* Auto scrolling */
   if(level->hor_autoscroll_speed)
   {
-    scroll_x += level->hor_autoscroll_speed * frame_ratio;
+    scroll_x += level->hor_autoscroll_speed * elapsed_time;
+    displaymanager.get_viewport().set_translation(Vector(scroll_x, scroll_y));
     return;
   }
 
@@ -361,12 +355,13 @@ void World::scrolling(double frame_ratio)
       constant2 = 0.;
     }
     
-    float number = 2.5/(frame_ratio * CHANGE_DIR_SCROLL_SPEED/1000)*exp((CHANGE_DIR_SCROLL_SPEED-scrolling_timer.get_left())/1400.);
+    float number = 2.5/(elapsed_time * CHANGE_DIR_SCROLL_SPEED/1000)*exp((CHANGE_DIR_SCROLL_SPEED-scrolling_timer.get_left())/1400.);
     if(left) number *= -1.;
 
     scroll_x += number
-           + constant1 * tux->physic.get_velocity_x() * frame_ratio
-           + constant2 * tux->physic.get_acceleration_x() * frame_ratio * frame_ratio;
+           + constant1 * tux->physic.get_velocity_x() * elapsed_time
+           + constant2 * tux->physic.get_acceleration_x() * elapsed_time *
+            elapsed_time;
 
     if ((right && final_scroll_x - scroll_x < 0) || (left && final_scroll_x - scroll_x > 0))
       scroll_x = final_scroll_x;
@@ -385,6 +380,8 @@ void World::scrolling(double frame_ratio)
     scroll_x = level->width * 32 - screen->w;
   if(scroll_x < 0)
     scroll_x = 0;
+
+  displaymanager.get_viewport().set_translation(Vector(scroll_x, scroll_y));
 }
 
 void
@@ -402,7 +399,7 @@ World::collision_handler()
             {
               // We have detected a collision and now call the
               // collision functions of the collided objects.
-              (*j)->collision(&bullets[i], CO_BULLET, COLLISION_NORMAL);
+              (*j)->collision(bullets[i], CO_BULLET, COLLISION_NORMAL);
               bullets[i]->collision(CO_BADGUY);
               break; // bullet is invalid now, so break
             }