Added wall jumps
This commit is contained in:
@@ -9,7 +9,8 @@ extends CharacterBody2D
|
|||||||
|
|
||||||
@export_group("Jump", "jump")
|
@export_group("Jump", "jump")
|
||||||
@export_range(0.0, 1000.0) var jump_max_fall_speed := 1000
|
@export_range(0.0, 1000.0) var jump_max_fall_speed := 1000
|
||||||
@export_range(0.0, 1000.0) var jump_velocity := 500.0
|
@export_range(0.0, 1000.0) var jump_floor_velocity := 500.0
|
||||||
|
@export var jump_wall_velocity := Vector2(500, 500)
|
||||||
|
|
||||||
@export_group("Gravity factors", "gravity_factor")
|
@export_group("Gravity factors", "gravity_factor")
|
||||||
@export_range(0.0, 2.0) var gravity_factor_jump := 1.0
|
@export_range(0.0, 2.0) var gravity_factor_jump := 1.0
|
||||||
@@ -25,15 +26,18 @@ extends CharacterBody2D
|
|||||||
|
|
||||||
var _slow_down_tween: Tween
|
var _slow_down_tween: Tween
|
||||||
|
|
||||||
var _wall_normal: = 0.0
|
var _last_wall_normal: = 0.0
|
||||||
|
|
||||||
|
|
||||||
@onready var state_machine : StateMachine = $StateMachine
|
@onready var state_machine : StateMachine = $StateMachine
|
||||||
|
|
||||||
@onready var jump_buffer_timer : Timer = $JumpBufferTimer
|
@onready var jump_buffer_timer : Timer = $JumpBufferTimer
|
||||||
@onready var coyote_time_timer : Timer = $CoyoteTimeTimer
|
|
||||||
|
@onready var floor_coyote_time_timer : Timer = $FloorCoyoteTimeTimer
|
||||||
|
@onready var wall_coyote_time_timer : Timer = $WallCoyoteTimeTimer
|
||||||
|
|
||||||
|
@onready var wall_attach_timer : Timer = $WallAttachTimer
|
||||||
@onready var attack_cooldown_timer : Timer = $AttackCooldownTimer
|
@onready var attack_cooldown_timer : Timer = $AttackCooldownTimer
|
||||||
@onready var slide_delay_timer : Timer = $SlideDelayTimer
|
|
||||||
|
|
||||||
@onready var _max_speed := movement_max_speed_normal
|
@onready var _max_speed := movement_max_speed_normal
|
||||||
|
|
||||||
@@ -44,35 +48,50 @@ func _ready() -> void:
|
|||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
if is_on_floor():
|
if is_on_floor():
|
||||||
coyote_time_timer.start()
|
floor_coyote_time_timer.start()
|
||||||
|
_last_wall_normal = 0.0
|
||||||
if is_on_ceiling_only() and velocity.y < 0.0:
|
if is_on_ceiling_only() and velocity.y < 0.0:
|
||||||
velocity.y = 0.0
|
velocity.y = 0.0
|
||||||
|
|
||||||
|
var input_direction := Input.get_axis("move_left", "move_right")
|
||||||
|
if Input.is_action_just_pressed("jump"):
|
||||||
|
jump_buffer_timer.start()
|
||||||
|
|
||||||
if not is_on_floor():
|
if not is_on_floor():
|
||||||
if is_on_wall():
|
|
||||||
_wall_normal = signf(velocity.x)
|
|
||||||
print("On wall! ", velocity.x, " ", Engine.get_frames_drawn())
|
|
||||||
else:
|
|
||||||
var gravity_factor := gravity_factor_jump if velocity.y < 0.0 else gravity_factor_fall
|
var gravity_factor := gravity_factor_jump if velocity.y < 0.0 else gravity_factor_fall
|
||||||
|
|
||||||
|
if is_on_wall_only() and not is_zero_approx(input_direction):
|
||||||
|
var wall_normal := get_wall_normal().x
|
||||||
|
if (wall_normal * input_direction) < 0.0:
|
||||||
|
wall_coyote_time_timer.start()
|
||||||
|
if sign(wall_normal) != sign(_last_wall_normal):
|
||||||
|
wall_attach_timer.start()
|
||||||
|
_last_wall_normal = wall_normal
|
||||||
|
|
||||||
|
if not Input.is_action_pressed("move_down") and velocity.y > 0.0:
|
||||||
|
gravity_factor = gravity_factor_slide if wall_attach_timer.is_stopped() else 0.0
|
||||||
|
|
||||||
if velocity.y < 0.0 and not Input.is_action_pressed("jump"):
|
if velocity.y < 0.0 and not Input.is_action_pressed("jump"):
|
||||||
velocity.y *= gravity_factor_passive_jump
|
velocity.y *= gravity_factor_passive_jump
|
||||||
|
|
||||||
velocity += get_gravity() * gravity_factor * delta
|
velocity += get_gravity() * gravity_factor * delta
|
||||||
velocity.y = clampf(velocity.y, -jump_max_fall_speed, jump_max_fall_speed)
|
velocity.y = clampf(velocity.y, -jump_max_fall_speed, jump_max_fall_speed)
|
||||||
|
|
||||||
|
if not jump_buffer_timer.is_stopped():
|
||||||
if Input.is_action_just_pressed("jump"):
|
if not floor_coyote_time_timer.is_stopped():
|
||||||
jump_buffer_timer.start()
|
velocity.y = -jump_floor_velocity
|
||||||
|
|
||||||
if not coyote_time_timer.is_stopped() and not jump_buffer_timer.is_stopped():
|
|
||||||
velocity.y = -jump_velocity
|
|
||||||
jump_buffer_timer.stop()
|
jump_buffer_timer.stop()
|
||||||
coyote_time_timer.stop()
|
floor_coyote_time_timer.stop()
|
||||||
|
elif not wall_coyote_time_timer.is_stopped():
|
||||||
|
velocity = -jump_wall_velocity
|
||||||
|
velocity.x *= -_last_wall_normal
|
||||||
|
jump_buffer_timer.stop()
|
||||||
|
wall_coyote_time_timer.stop()
|
||||||
|
|
||||||
var direction := Input.get_axis("move_left", "move_right")
|
|
||||||
if direction:
|
if input_direction:
|
||||||
velocity.x = move_toward(velocity.x, direction * _max_speed, movement_acceleration * delta)
|
var input_velocity := input_direction * _max_speed
|
||||||
|
velocity.x = move_toward(velocity.x, input_velocity, movement_acceleration * delta)
|
||||||
else:
|
else:
|
||||||
velocity.x = move_toward(velocity.x, 0, movement_acceleration * delta)
|
velocity.x = move_toward(velocity.x, 0, movement_acceleration * delta)
|
||||||
|
|
||||||
|
|||||||
@@ -22,18 +22,24 @@ player = NodePath("../..")
|
|||||||
|
|
||||||
[node name="JumpBufferTimer" type="Timer" parent="." unique_id=1845152635]
|
[node name="JumpBufferTimer" type="Timer" parent="." unique_id=1845152635]
|
||||||
process_callback = 0
|
process_callback = 0
|
||||||
|
wait_time = 0.1
|
||||||
|
one_shot = true
|
||||||
|
|
||||||
|
[node name="FloorCoyoteTimeTimer" type="Timer" parent="." unique_id=867376979]
|
||||||
|
process_callback = 0
|
||||||
wait_time = 0.05
|
wait_time = 0.05
|
||||||
one_shot = true
|
one_shot = true
|
||||||
|
|
||||||
[node name="CoyoteTimeTimer" type="Timer" parent="." unique_id=867376979]
|
[node name="WallCoyoteTimeTimer" type="Timer" parent="." unique_id=548389084]
|
||||||
process_callback = 0
|
process_callback = 0
|
||||||
wait_time = 0.05
|
wait_time = 0.1
|
||||||
|
one_shot = true
|
||||||
|
|
||||||
|
[node name="WallAttachTimer" type="Timer" parent="." unique_id=1472311359]
|
||||||
|
process_callback = 0
|
||||||
|
wait_time = 0.5
|
||||||
one_shot = true
|
one_shot = true
|
||||||
|
|
||||||
[node name="AttackCooldownTimer" type="Timer" parent="." unique_id=1208896947]
|
[node name="AttackCooldownTimer" type="Timer" parent="." unique_id=1208896947]
|
||||||
process_callback = 0
|
process_callback = 0
|
||||||
wait_time = 0.75
|
wait_time = 0.75
|
||||||
|
|
||||||
[node name="SlideDelayTimer" type="Timer" parent="." unique_id=1746851787]
|
|
||||||
process_callback = 0
|
|
||||||
wait_time = 0.75
|
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ shape = SubResource("RectangleShape2D_bhunq")
|
|||||||
position = Vector2(0, -1100)
|
position = Vector2(0, -1100)
|
||||||
shape = SubResource("RectangleShape2D_bhunq")
|
shape = SubResource("RectangleShape2D_bhunq")
|
||||||
|
|
||||||
|
[node name="CollisionShape2D4" type="CollisionShape2D" parent="StaticBody2D" index="3" unique_id=558475574]
|
||||||
|
position = Vector2(200, -1000)
|
||||||
|
shape = SubResource("RectangleShape2D_bhunq")
|
||||||
|
|
||||||
[node name="Menus" parent="." index="2" unique_id=1464185162]
|
[node name="Menus" parent="." index="2" unique_id=1464185162]
|
||||||
offset_left = -320.0
|
offset_left = -320.0
|
||||||
offset_top = -210.0
|
offset_top = -210.0
|
||||||
|
|||||||
@@ -35,11 +35,26 @@ gdscript/warnings/untyped_declaration=1
|
|||||||
window/size/viewport_width=640
|
window/size/viewport_width=640
|
||||||
window/size/viewport_height=360
|
window/size/viewport_height=360
|
||||||
window/size/resizable=false
|
window/size/resizable=false
|
||||||
|
window/size/maximize_disabled=true
|
||||||
window/stretch/mode="viewport"
|
window/stretch/mode="viewport"
|
||||||
window/stretch/scale_mode="integer"
|
window/stretch/scale_mode="integer"
|
||||||
|
|
||||||
[input]
|
[input]
|
||||||
|
|
||||||
|
ui_accept={
|
||||||
|
"deadzone": 0.5,
|
||||||
|
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":16,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||||
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":16,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||||
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":16,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
|
||||||
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
ui_cancel={
|
||||||
|
"deadzone": 0.5,
|
||||||
|
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":16,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194305,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||||
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
ui_left={
|
ui_left={
|
||||||
"deadzone": 0.5,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":16,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":16,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||||
|
|||||||
Reference in New Issue
Block a user