Merge pull request #8259 from bojidar-bg/move-slide-wall-fix

Fix is_move_and_slide_on_wall, make move_and_slide floor angle configurable
This commit is contained in:
Rémi Verschelde 2017-04-05 01:24:19 +02:00 committed by GitHub
commit 02f9851d0d
3 changed files with 8 additions and 5 deletions

View file

@ -21836,6 +21836,8 @@
</argument> </argument>
<argument index="3" name="max_bounces" type="int" default="4"> <argument index="3" name="max_bounces" type="int" default="4">
</argument> </argument>
<argument index="4" name="floor_max_angle" type="float" default="0.785398">
</argument>
<description> <description>
</description> </description>
</method> </method>
@ -21846,6 +21848,7 @@
</argument> </argument>
<description> <description>
Move the body to the given position. This is not a teleport, and the body will stop if there is an obstacle. The returned vector is how much movement was remaining before being stopped. Move the body to the given position. This is not a teleport, and the body will stop if there is an obstacle. The returned vector is how much movement was remaining before being stopped.
[code]floor_max_angle[/code] is in radians (default is pi/4), and filters which obstacles should be considered as floors/cellings instead of walls.
</description> </description>
</method> </method>
<method name="revert_motion"> <method name="revert_motion">

View file

@ -1168,7 +1168,7 @@ Vector2 KinematicBody2D::move(const Vector2 &p_motion) {
#endif #endif
} }
Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const Vector2 &p_floor_direction, float p_slope_stop_min_velocity, int p_max_bounces) { Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const Vector2 &p_floor_direction, float p_slope_stop_min_velocity, int p_max_bounces, float p_floor_max_angle) {
Vector2 motion = (move_and_slide_floor_velocity + p_linear_velocity) * get_fixed_process_delta_time(); Vector2 motion = (move_and_slide_floor_velocity + p_linear_velocity) * get_fixed_process_delta_time();
Vector2 lv = p_linear_velocity; Vector2 lv = p_linear_velocity;
@ -1189,7 +1189,7 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const
//all is a wall //all is a wall
move_and_slide_on_wall = true; move_and_slide_on_wall = true;
} else { } else {
if (get_collision_normal().dot(p_floor_direction) > Math::cos(Math::deg2rad((float)45))) { //floor if (get_collision_normal().dot(p_floor_direction) >= Math::cos(p_floor_max_angle)) { //floor
move_and_slide_on_floor = true; move_and_slide_on_floor = true;
move_and_slide_floor_velocity = get_collider_velocity(); move_and_slide_floor_velocity = get_collider_velocity();
@ -1198,7 +1198,7 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const
revert_motion(); revert_motion();
return Vector2(); return Vector2();
} }
} else if (get_collision_normal().dot(p_floor_direction) < Math::cos(Math::deg2rad((float)45))) { //ceiling } else if (get_collision_normal().dot(-p_floor_direction) <= Math::cos(p_floor_max_angle)) { //ceiling
move_and_slide_on_ceiling = true; move_and_slide_on_ceiling = true;
} else { } else {
move_and_slide_on_wall = true; move_and_slide_on_wall = true;
@ -1308,7 +1308,7 @@ void KinematicBody2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("move", "rel_vec"), &KinematicBody2D::move); ClassDB::bind_method(D_METHOD("move", "rel_vec"), &KinematicBody2D::move);
ClassDB::bind_method(D_METHOD("move_to", "position"), &KinematicBody2D::move_to); ClassDB::bind_method(D_METHOD("move_to", "position"), &KinematicBody2D::move_to);
ClassDB::bind_method(D_METHOD("move_and_slide", "linear_velocity", "floor_normal", "slope_stop_min_velocity", "max_bounces"), &KinematicBody2D::move_and_slide, DEFVAL(Vector2(0, 0)), DEFVAL(5), DEFVAL(4)); ClassDB::bind_method(D_METHOD("move_and_slide", "linear_velocity", "floor_normal", "slope_stop_min_velocity", "max_bounces", "floor_max_angle"), &KinematicBody2D::move_and_slide, DEFVAL(Vector2(0, 0)), DEFVAL(5), DEFVAL(4), DEFVAL(Math::deg2rad((float)45)));
ClassDB::bind_method(D_METHOD("test_move", "from", "rel_vec"), &KinematicBody2D::test_move); ClassDB::bind_method(D_METHOD("test_move", "from", "rel_vec"), &KinematicBody2D::test_move);
ClassDB::bind_method(D_METHOD("get_travel"), &KinematicBody2D::get_travel); ClassDB::bind_method(D_METHOD("get_travel"), &KinematicBody2D::get_travel);

View file

@ -314,7 +314,7 @@ public:
void set_collision_margin(float p_margin); void set_collision_margin(float p_margin);
float get_collision_margin() const; float get_collision_margin() const;
Vector2 move_and_slide(const Vector2 &p_linear_velocity, const Vector2 &p_floor_direction = Vector2(0, 0), float p_slope_stop_min_velocity = 5, int p_max_bounces = 4); Vector2 move_and_slide(const Vector2 &p_linear_velocity, const Vector2 &p_floor_direction = Vector2(0, 0), float p_slope_stop_min_velocity = 5, int p_max_bounces = 4, float p_floor_max_angle = Math::deg2rad((float)45));
bool is_move_and_slide_on_floor() const; bool is_move_and_slide_on_floor() const;
bool is_move_and_slide_on_wall() const; bool is_move_and_slide_on_wall() const;
bool is_move_and_slide_on_ceiling() const; bool is_move_and_slide_on_ceiling() const;