mirror of
https://github.com/godotengine/godot-demo-projects.git
synced 2026-01-04 23:10:08 +01:00
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).
74 lines
1.8 KiB
GDScript
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
|