|
|
|
|
@ -2,17 +2,27 @@ extends CharacterBody2D |
|
|
|
|
|
|
|
|
|
class_name Player |
|
|
|
|
|
|
|
|
|
const SPEED = 300.0 |
|
|
|
|
const JUMP_VELOCITY = -300.0 |
|
|
|
|
const SPEED = 100.0 |
|
|
|
|
const JUMP_VELOCITY = 200.0 |
|
|
|
|
|
|
|
|
|
const STATES= [ |
|
|
|
|
"spawn", |
|
|
|
|
"idle", |
|
|
|
|
"walk", |
|
|
|
|
"climb", |
|
|
|
|
"jump", |
|
|
|
|
"die" |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
var use_gravity = { |
|
|
|
|
"climb": false, |
|
|
|
|
"die": false, |
|
|
|
|
"idle": true, |
|
|
|
|
"jump": true, |
|
|
|
|
"spawn": true, |
|
|
|
|
"walk": true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# Get the gravity from the project settings to be synced with RigidBody nodes. |
|
|
|
|
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") |
|
|
|
|
|
|
|
|
|
@ -24,7 +34,7 @@ func _enter_spawn(): |
|
|
|
|
$fsm.set_next_state("idle") |
|
|
|
|
|
|
|
|
|
func on_enter_idle_state(): |
|
|
|
|
velocity.x = 0.0 |
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
func idle_state(_delta): |
|
|
|
|
var direction = Input.get_axis("ui_left", "ui_right") |
|
|
|
|
@ -37,32 +47,74 @@ func idle_state(_delta): |
|
|
|
|
func walk_state(_delta): |
|
|
|
|
var direction = Input.get_axis("ui_left", "ui_right") |
|
|
|
|
|
|
|
|
|
if direction: |
|
|
|
|
if direction != 0: |
|
|
|
|
velocity.x = direction * SPEED |
|
|
|
|
else: |
|
|
|
|
velocity.x = 0 |
|
|
|
|
$fsm.set_next_state("idle") |
|
|
|
|
|
|
|
|
|
if Input.is_action_just_pressed("ui_accept") and is_on_floor(): |
|
|
|
|
$fsm.set_next_state("jump") |
|
|
|
|
|
|
|
|
|
# detect collision with wall or ceiling to enter climb state |
|
|
|
|
if is_on_wall() or is_on_ceiling(): |
|
|
|
|
velocity.y = 0 |
|
|
|
|
$fsm.set_next_state("climb") |
|
|
|
|
|
|
|
|
|
func on_enter_jump_state(): |
|
|
|
|
velocity.y = JUMP_VELOCITY |
|
|
|
|
if is_on_floor(): |
|
|
|
|
velocity.y = -JUMP_VELOCITY |
|
|
|
|
|
|
|
|
|
func jump_state(_delta): |
|
|
|
|
var direction = Input.get_axis("ui_left", "ui_right") |
|
|
|
|
|
|
|
|
|
velocity.x = move_toward(velocity.x, direction * SPEED, SPEED) |
|
|
|
|
if(direction): |
|
|
|
|
velocity.x = move_toward(velocity.x, direction * SPEED, SPEED) |
|
|
|
|
|
|
|
|
|
if is_on_floor(): |
|
|
|
|
if direction: |
|
|
|
|
$fsm.set_next_state("walk") |
|
|
|
|
else: |
|
|
|
|
velocity.x = 0 |
|
|
|
|
$fsm.set_next_state("idle") |
|
|
|
|
|
|
|
|
|
if is_on_wall() or is_on_ceiling(): |
|
|
|
|
$fsm.set_next_state("climb") |
|
|
|
|
|
|
|
|
|
func on_enter_climb_state(): |
|
|
|
|
$sprite.modulate = Color(1, 0, 0) |
|
|
|
|
velocity = Vector2(0, 0) |
|
|
|
|
|
|
|
|
|
func on_exit_climb_state(): |
|
|
|
|
$sprite.modulate = Color(1, 1, 1) |
|
|
|
|
|
|
|
|
|
func climb_state(_delta): |
|
|
|
|
if is_on_wall(): |
|
|
|
|
var direction = Input.get_axis("ui_up", "ui_down") |
|
|
|
|
velocity = Vector2(0, direction * SPEED) |
|
|
|
|
|
|
|
|
|
if is_on_ceiling(): |
|
|
|
|
var direction = Input.get_axis("ui_left", "ui_right") |
|
|
|
|
velocity = Vector2(direction * SPEED, 0) |
|
|
|
|
|
|
|
|
|
if Input.is_action_just_pressed("ui_accept") and is_on_wall(): |
|
|
|
|
var wall_position = get_slide_collision(0).get_normal().x |
|
|
|
|
var jump_normal = Vector2(wall_position, -0.5).normalized() |
|
|
|
|
velocity = jump_normal * JUMP_VELOCITY |
|
|
|
|
|
|
|
|
|
$fsm.set_next_state("jump") |
|
|
|
|
if is_on_ceiling() && Input.is_action_just_pressed("ui_down"): |
|
|
|
|
velocity.y = 0 |
|
|
|
|
$fsm.set_next_state("idle") |
|
|
|
|
|
|
|
|
|
if !is_on_wall() && !is_on_ceiling(): |
|
|
|
|
$fsm.set_next_state("idle") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func after_state(delta): |
|
|
|
|
move_and_slide() |
|
|
|
|
|
|
|
|
|
if not is_on_floor(): |
|
|
|
|
if use_gravity[$fsm.current_state] == true: |
|
|
|
|
velocity.y += gravity * delta |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|