Skip to content

Commit

Permalink
badguy/walking_badguy.cpp: Fix the acceleration code.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Florian Forster committed Mar 5, 2010
1 parent 08893ef commit 8a67a77
Showing 1 changed file with 32 additions and 9 deletions.
41 changes: 32 additions & 9 deletions src/badguy/walking_badguy.cpp
Expand Up @@ -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) {
Expand Down Expand Up @@ -173,6 +195,7 @@ WalkingBadguy::freeze()
{
BadGuy::freeze();
physic.set_velocity_x(0);
set_walk_speed (0.0);
}

void
Expand Down

0 comments on commit 8a67a77

Please sign in to comment.