badguy/walking_badguy.cpp: Fix the acceleration code.
authorFlorian Forster <supertux@octo.it>
Fri, 5 Mar 2010 07:42:10 +0000 (07:42 +0000)
committerFlorian Forster <supertux@octo.it>
Fri, 5 Mar 2010 07:42:10 +0000 (07:42 +0000)
It should now be able to handle all situations, even when the badguy is thrown
backwards faster than he would normally walk forward (was broken before) and
frozen badguys are no longer sliding along without a move animation.

SVN-Revision: 6548

src/badguy/walking_badguy.cpp

index d5e3426..5df3555 100644 (file)
@@ -95,19 +95,41 @@ WalkingBadguy::active_update(float elapsed_time)
 {
   BadGuy::active_update(elapsed_time);
 
-  float abs_cur_walk_speed = fabs (physic.get_velocity_x ());
-  if ((abs_cur_walk_speed > (walk_speed - 5.0))
-      && (abs_cur_walk_speed < (walk_speed + 5.0)))
+  float current_x_velocity = physic.get_velocity_x ();
+  float dest_x_velocity = (dir == LEFT) ? -walk_speed : +walk_speed;
+
+  if (frozen)
+  {
+    physic.set_velocity_x (0.0);
+    physic.set_acceleration_x (0.0);
+  }
+  /* We're very close to our target speed. Just set it to avoid oscillation */
+  else if ((current_x_velocity > (dest_x_velocity - 5.0))
+      && (current_x_velocity < (dest_x_velocity + 5.0)))
   {
-    physic.set_velocity_x ((dir == LEFT) ? -walk_speed : +walk_speed);
+    physic.set_velocity_x (dest_x_velocity);
     physic.set_acceleration_x (0.0);
   }
-  /* acceleration == walk-speed => it will take one second to get from zero to full speed. */
-  else if (abs_cur_walk_speed < walk_speed) {
-    physic.set_acceleration_x ((dir == LEFT) ? -walk_speed : +walk_speed);
+  /* Check if we're going too slow or even in the wrong direction */
+  else if (((dir == LEFT) && (current_x_velocity > dest_x_velocity))
+      || ((dir == RIGHT) && (current_x_velocity < dest_x_velocity)))
+  {
+    /* acceleration == walk-speed => it will take one second to get from zero
+     * to full speed. */
+    physic.set_acceleration_x (dest_x_velocity);
+  }
+  /* Check if we're going too fast */
+  else if (((dir == LEFT) && (current_x_velocity < dest_x_velocity))
+      || ((dir == RIGHT) && (current_x_velocity > dest_x_velocity)))
+  {
+    /* acceleration == walk-speed => it will take one second to get twice the
+     * speed to normal speed. */
+    physic.set_acceleration_x ((-1.0) * dest_x_velocity);
   }
-  else if (abs_cur_walk_speed > walk_speed) {
-    physic.set_acceleration_x ((dir == LEFT) ? +walk_speed : -walk_speed);
+  else
+  {
+    /* The above should have covered all cases. */
+    assert (23 == 42);
   }
 
   if (max_drop_height > -1) {
@@ -173,6 +195,7 @@ WalkingBadguy::freeze()
 {
   BadGuy::freeze();
   physic.set_velocity_x(0);
+  set_walk_speed (0.0);
 }
 
 void