diff --git a/2d/kinematic_char/circle.png b/2d/kinematic_char/circle.png new file mode 100644 index 00000000..ddb3ac4b Binary files /dev/null and b/2d/kinematic_char/circle.png differ diff --git a/2d/kinematic_char/colworld.scn b/2d/kinematic_char/colworld.scn index 6c73e8b1..e6670536 100644 Binary files a/2d/kinematic_char/colworld.scn and b/2d/kinematic_char/colworld.scn differ diff --git a/2d/kinematic_char/long_obstacle.png b/2d/kinematic_char/long_obstacle.png new file mode 100644 index 00000000..88cb22da Binary files /dev/null and b/2d/kinematic_char/long_obstacle.png differ diff --git a/2d/kinematic_char/player.gd b/2d/kinematic_char/player.gd index e8b3cc8d..3549ba38 100644 --- a/2d/kinematic_char/player.gd +++ b/2d/kinematic_char/player.gd @@ -21,6 +21,8 @@ const STOP_FORCE = 1300 const JUMP_SPEED = 200 const JUMP_MAX_AIRBORNE_TIME=0.2 +const SLIDE_STOP_VELOCITY=1.0 #one pixel per second +const SLIDE_STOP_MIN_TRAVEL=1.0 #one pixel var velocity = Vector2() var on_air_time=100 var jumping=false @@ -86,16 +88,29 @@ func _fixed_process(delta): #char is on floor on_air_time=0 floor_velocity=get_collider_velocity() - #velocity.y=0 - #But we were moving and our motion was interrupted, - #so try to complete the motion by "sliding" - #by the normal - motion = n.slide(motion) - velocity = n.slide(velocity) - - #then move again - move(motion) + + if (on_air_time==0 and force.x==0 and get_travel().length() < SLIDE_STOP_MIN_TRAVEL and abs(velocity.x) < SLIDE_STOP_VELOCITY and get_collider_velocity()==Vector2()): + #Since this formula will always slide the character around, + #a special case must be considered to to stop it from moving + #if standing on an inclined floor. Conditions are: + # 1) Standin on floor (on_air_time==0) + # 2) Did not move more than one pixel (get_travel().length() < SLIDE_STOP_MIN_TRAVEL) + # 3) Not moving horizontally (abs(velocity.x) < SLIDE_STOP_VELOCITY) + # 4) Collider is not moving + + revert_motion() + velocity.y=0.0 + + else: + #For every other case of motion,our motion was interrupted. + #Try to complete the motion by "sliding" + #by the normal + + motion = n.slide(motion) + velocity = n.slide(velocity) + #then move again + move(motion) if (floor_velocity!=Vector2()): #if floor moves, move with floor