Fixed check for Block killing Badguy from below
[supertux.git] / src / object / camera.cpp
index 51d22d2..049ea88 100644 (file)
@@ -202,7 +202,7 @@ Camera::write(lisp::Writer& writer)
 void
 Camera::reset(const Vector& tuxpos)
 {
-  translation.x = tuxpos.x - SCREEN_WIDTH/3 * 2;
+  translation.x = tuxpos.x - SCREEN_WIDTH/2;
   translation.y = tuxpos.y - SCREEN_HEIGHT/2;
   shakespeed = 0;
   shaketimer.stop();
@@ -326,14 +326,10 @@ Camera::update_scroll_normal(float elapsed_time)
     // position where he last touched the ground. (this probably needs
     // exceptions for trampolines and similar things in the future)
     float target_y;
-#if 0
     if(player->fall_mode == Player::JUMPING)
       target_y = player->last_ground_y + player->get_bbox().get_height();
     else
       target_y = player->get_bbox().p2.y;
-#endif
-    target_y = player->last_ground_y;
-
     target_y -= SCREEN_HEIGHT * config.target_y;
 
     // delta_y is the distance we'd have to travel to directly reach target_y
@@ -357,7 +353,33 @@ Camera::update_scroll_normal(float elapsed_time)
         player_pos.y - SCREEN_HEIGHT * (0.5f - halfsize));
   }
   if(ymode == 4) {
-    // TODO...
+    float upperend = SCREEN_WIDTH * config.edge_x;
+    float lowerend = SCREEN_WIDTH * (1 - config.edge_x);
+
+    if (player_delta.y < -EPSILON) {
+      // walking left
+      lookahead_pos -= player_delta.x * config.dynamic_speed_sm;
+
+      if(lookahead_pos > lowerend) {
+        lookahead_pos = lowerend;
+      }
+    } else if (player_delta.y > EPSILON) {
+      // walking right
+      lookahead_pos -= player_delta.y * config.dynamic_speed_sm;
+      if(lookahead_pos < upperend) {
+        lookahead_pos = upperend;
+      }
+    }
+
+    // adjust for level ends
+    if (player_pos.y < upperend) {
+      lookahead_pos = upperend;
+    }
+    if (player_pos.y > sector->get_width() - upperend) {
+      lookahead_pos = lowerend;
+    }
+
+    translation.y = player_pos.y - lookahead_pos;
   }
 
   if(ymode != 0 && config.clamp_y > 0) {
@@ -490,6 +512,12 @@ Camera::update_scroll_normal(float elapsed_time)
       }
     }
 
+    if(player->peeking_direction() == ::LEFT) {
+      lookahead_pos += config.max_speed_x * elapsed_time * 3.0f;
+    } else if(player->peeking_direction() == ::RIGHT) {
+      lookahead_pos -= config.max_speed_x * elapsed_time * 3.0f;
+    }
+
     // adjust for level ends
     if (player_pos.x < LEFTEND) {
       lookahead_pos = LEFTEND;
@@ -534,3 +562,9 @@ Camera::update_scroll_to(float elapsed_time)
 
   translation = scroll_from + (scroll_goal - scroll_from) * scroll_to_pos;
 }
+
+Vector
+Camera::get_center() const {
+  return translation + Vector(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
+}
+