瀏覽代碼

Fix is_move_and_slide_on_wall, make move_and_slide floor angle configurable

Fixes #7313
Bojidar Marinov 8 年之前
父節點
當前提交
289abd3710
共有 3 個文件被更改,包括 8 次插入5 次删除
  1. 3 0
      doc/base/classes.xml
  2. 4 4
      scene/2d/physics_body_2d.cpp
  3. 1 1
      scene/2d/physics_body_2d.h

+ 3 - 0
doc/base/classes.xml

@@ -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">

+ 4 - 4
scene/2d/physics_body_2d.cpp

@@ -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;
@@ -1307,7 +1307,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);

+ 1 - 1
scene/2d/physics_body_2d.h

@@ -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;