cliff-hanger/Player/Player.gd

220 lines
6.0 KiB
GDScript

extends KinematicBody2D
const UP = Vector2.UP
signal wall_slide_state
signal wall_slide_exited
signal victory()
signal state_change(states,state)
signal killed()
var velocity = Vector2()
var WALL_JUMP_VELOCITY = Vector2(12*13,-200)
var KNOCKBACK_VELOCITY = Vector2(12*5,-100)
export var move_speed = 12*10
export var jump_velocity=-220
export var gravity = 420
var is_grounded
var is_on_edge
var is_jumping = false
var is_dead = false
var has_won = false
var stick_to_wall = false
var can_coyote_time = false
var wall_direction = 1
var snap = Vector2.DOWN*12
var slide_velocity
var current_state = null
onready var grabbing_shape = $Grabbing_shape
onready var left_raycast = $WallGrabRaycast/Right
onready var right_raycast = $WallGrabRaycast/Left
onready var other_left_raycast = $WallGrabRaycast/Right/RightWall
onready var other_right_raycast = $WallGrabRaycast/Left/LeftWall
onready var sticky_rightcast = $WallGrabRaycast/Right/RightWall2
onready var sticky_leftcast = $WallGrabRaycast/Left/LeftWall2
onready var moving_rightcast = $WallGrabRaycast/Right/RightWall3
onready var moving_leftcast = $WallGrabRaycast/Left/LeftWall3
onready var anim_player = $Body/AnimationPlayer
onready var effect_player = $Body/Effect_Player
onready var body = $Body
onready var cam = $Camera2D
onready var physics_shape =$PhysicsShape
onready var wall_slide_cooldown = $WallslideCooldown
onready var stick_to_wall_timer = $WallslideStick
onready var coyote_timer = $CoyoteTimer
onready var attach_pos = $AttachPosition
# onready var jump_sound = $SFX/jumpsound
# onready var hurt_sound = $SFX/hurtsound
# onready var dead_sound = $SFX/deadsound
# onready var vic_sound = $SFX/victory
var move_direction
# Called when the node enters the scene tree for the first time.
func _ready():
connect("killed",get_parent().get_node("Background/GUI"),"_on_Player_killed")
connect("state_change",get_parent().get_node("Background/GUI"),"_on_Player_state_change")
connect("victory",get_parent().get_node("Background/GUI"),"_on_Player_victory")
connect("wall_slide_exited",get_parent().get_node("Background/GUI"),"_on_Player_wall_slide_exited")
connect("wall_slide_state",get_parent().get_node("Background/GUI"),"_on_Player_wall_slide_state")
pass # Replace with function body.
func _apply_movement(delta):
var was_on_floor = is_on_floor()
velocity = move_and_slide_with_snap(velocity,snap,UP)
if !is_on_floor() and was_on_floor and !is_jumping:
coyote_timer.start()
is_grounded = is_on_floor()
func _apply_wall_stick():
#snap = Vector2(wall_direction*32,0)
velocity.x = wall_direction*1000
func _apply_gravity(delta):
velocity.y +=gravity*delta
if is_jumping and velocity.y >=0:
is_jumping = false
func jump():
is_jumping=true
velocity.y = jump_velocity
func wall_jump():
var wall_jump_velocity = WALL_JUMP_VELOCITY
wall_jump_velocity.x *= -wall_direction
velocity = wall_jump_velocity
body.scale.x = -wall_direction
func cut_jump():
if velocity.y < -80:
velocity.y = -80
func _handle_wall_slide_stickyness():
if move_direction!=0 and move_direction != wall_direction:
if stick_to_wall_timer.is_stopped():
stick_to_wall_timer.start()
else:
stick_to_wall_timer.stop()
func _update_move_direction():
move_direction = -Input.get_action_strength("left") + Input.get_action_strength("right")
func _handle_move_input():
velocity.x = lerp(velocity.x,move_speed*move_direction,get_h_weight())
if move_direction !=0:
body.scale.x = move_direction
#physics_shape.position.x = move_direction
func get_h_weight():
if is_on_floor():
return 0.15
else:
if move_direction == 0:
return 0.02
elif move_direction == sign(velocity.x) and abs(velocity.x) > move_speed:
return 0.0
else:
return 0.1
func _cap_gravity_wall_slide():
var max_velocity
if !Input.is_action_pressed("down"):
max_velocity = slide_velocity
else:
grabbing_shape.set_deferred("disabled",true)
#print("grabbing_shape.disabled")
max_velocity = 6*24
velocity.y = min(velocity.y,max_velocity)
func _update_wall_direction():
var is_near_wall_left = _check_is_valid_wall(left_raycast)
var is_near_wall_right= _check_is_valid_wall(right_raycast)
var edge_left = _check_there_is_an_edge(other_left_raycast)
var edge_right = _check_there_is_an_edge(other_right_raycast)
if edge_left or edge_right:
is_on_edge = true
else: is_on_edge = false
if is_near_wall_left and is_near_wall_right:
wall_direction = move_direction
else:
wall_direction = int(is_near_wall_left)-int(is_near_wall_right)
func _check_is_valid_wall(wall_raycast):
for raycast in wall_raycast.get_children():
if raycast.is_colliding():
if raycast.get_collider().is_in_group("moving"):
#moving wall
stick_to_wall = false
slide_velocity = 300
else:
slide_velocity = 0
stick_to_wall = true
#print(slide_velocity)
return true
return false
func _stick_to_moving_walls():
var rc1 = sticky_leftcast
var rc2 = sticky_rightcast
var rc
if rc1.is_colliding():
rc = rc1
elif rc2.is_colliding():
rc = rc2
else:
return
if rc.get_collider().is_in_group("moving"):
attach_pos.global_position.y = rc.get_collider().global_position.y-7
global_position.y = attach_pos.global_position.y
moving_rightcast.set_deferred("enabled",true)
moving_leftcast.set_deferred("enabled",true)
else:
print(rc.name)
attach_pos.global_position.y = rc.get_collider().world_to_map(position).y*24+5
global_position.y = attach_pos.global_position.y
func _check_there_is_an_edge(wall_raycast):
if wall_raycast.is_colliding():
return true
else: return false
func die():
if !has_won:
velocity.x = 0
var knockback_velocity = KNOCKBACK_VELOCITY
knockback_velocity.x *= -wall_direction if !wall_direction !=0 else 1
velocity = knockback_velocity
body.scale.x = wall_direction if wall_direction!=0 else 1
is_dead = true
func victory():
velocity.x = 0
is_dead=false
has_won = true
func _on_AllowedGrabTimer_timeout():
emit_signal("killed")
func _on_GUI_enable_camera():
print("CAMERA ENABLED")
cam.enable_camera = true
func _on_GUI_pause_camera():
cam.enable_camera = false