Files
godot-demo-projects/2d/physics_tests/utils/rigidbody_controller.gd
Hugo Locurcio bac1e69164 Use static typing in all demos (#1063)
This leads to code that is easier to understand and runs
faster thanks to GDScript's typed instructions.

The untyped declaration warning is now enabled on all projects
where type hints were added. All projects currently run without
any untyped declration warnings.

Dodge the Creeps and Squash the Creeps demos intentionally don't
use type hints to match the documentation, where type hints haven't
been adopted yet (given its beginner focus).
2024-06-01 12:12:18 +02:00

74 lines
1.8 KiB
GDScript

extends RigidBody2D
var _initial_velocity := Vector2.ZERO
var _constant_velocity := Vector2.ZERO
var _motion_speed := 400.0
var _gravity_force := 50.0
var _jump_force := 1000.0
var _velocity := Vector2.ZERO
var _floor_max_angle := 45.0
var _on_floor := false
var _jumping := false
var _keep_velocity := false
func _ready() -> void:
gravity_scale = 0.0
func _physics_process(_delta: float) -> void:
if _initial_velocity != Vector2.ZERO:
_velocity = _initial_velocity
_initial_velocity = Vector2.ZERO
_keep_velocity = true
elif _constant_velocity != Vector2.ZERO:
_velocity = _constant_velocity
elif not _keep_velocity:
_velocity.x = 0.0
# Handle horizontal controls.
if Input.is_action_pressed(&"character_left"):
if position.x > 0.0:
_velocity.x = -_motion_speed
_keep_velocity = false
_constant_velocity = Vector2.ZERO
elif Input.is_action_pressed(&"character_right"):
if position.x < 1024.0:
_velocity.x = _motion_speed
_keep_velocity = false
_constant_velocity = Vector2.ZERO
# Handle jump controls and gravity.
if is_on_floor():
if not _jumping and Input.is_action_just_pressed(&"character_jump"):
# Start jumping.
_jumping = true
_velocity.y = -_jump_force
elif not _jumping:
# Reset gravity.
_velocity.y = 0.0
else:
_velocity.y += _gravity_force
_jumping = false
linear_velocity = _velocity
func _integrate_forces(state: PhysicsDirectBodyState2D) -> void:
_on_floor = false
var contacts := state.get_contact_count()
for i in contacts:
var normal := state.get_contact_local_normal(i)
# Detect floor.
if acos(normal.dot(Vector2.UP)) <= deg_to_rad(_floor_max_angle) + 0.01:
_on_floor = true
# Detect ceiling.
if acos(normal.dot(-Vector2.UP)) <= deg_to_rad(_floor_max_angle) + 0.01:
_jumping = false
_velocity.y = 0.0
func is_on_floor() -> bool:
return _on_floor