-
Notifications
You must be signed in to change notification settings - Fork 1
/
Player.gd
178 lines (135 loc) · 5.06 KB
/
Player.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
extends KinematicBody2D
signal player_moving_signal
signal player_stopped_signal
signal player_entering_door_signal
signal player_entered_door_signal
const LandingDustEffect = preload("res://LandingDustEffect.tscn")
export var walk_speed = 4.0
export var jump_speed = 4.0
const TILE_SIZE = 16
onready var anim_tree = $AnimationTree
onready var anim_state = anim_tree.get("parameters/playback")
onready var ray = $BlockingRayCast2D
onready var ledge_ray = $LedgeRayCast2D
onready var shadow = $Shadow
onready var door_ray = $DoorRayCast2D
var jumping_over_ledge: bool = false
enum PlayerState { IDLE, TURNING, WALKING }
enum FacingDirection { LEFT, RIGHT, UP, DOWN }
var player_state = PlayerState.IDLE
var facing_direction = FacingDirection.DOWN
var initial_position = Vector2(0, 0)
var input_direction = Vector2(0, 1)
var is_moving = false
var stop_input: bool = false
var percent_moved_to_next_tile = 0.0
func _ready():
$Sprite.visible = true
anim_tree.active = true
initial_position = position
shadow.visible = false
anim_tree.set("parameters/Idle/blend_position", input_direction)
anim_tree.set("parameters/Walk/blend_position", input_direction)
anim_tree.set("parameters/Turn/blend_position", input_direction)
func set_spawn(location: Vector2, direction: Vector2):
anim_tree.set("parameters/Idle/blend_position", direction)
anim_tree.set("parameters/Walk/blend_position", direction)
anim_tree.set("parameters/Turn/blend_position", direction)
position = location
func _physics_process(delta):
if player_state == PlayerState.TURNING or stop_input:
return
elif is_moving == false:
process_player_movement_input()
elif input_direction != Vector2.ZERO:
anim_state.travel("Walk")
move(delta)
else:
anim_state.travel("Idle")
is_moving = false
func process_player_movement_input():
if input_direction.y == 0:
input_direction.x = int(Input.is_action_pressed("ui_right")) - int(Input.is_action_pressed("ui_left"))
if input_direction.x == 0:
input_direction.y = int(Input.is_action_pressed("ui_down")) - int(Input.is_action_pressed("ui_up"))
if input_direction != Vector2.ZERO:
anim_tree.set("parameters/Idle/blend_position", input_direction)
anim_tree.set("parameters/Walk/blend_position", input_direction)
anim_tree.set("parameters/Turn/blend_position", input_direction)
if need_to_turn():
player_state = PlayerState.TURNING
anim_state.travel("Turn")
else:
initial_position = position
is_moving = true
else:
anim_state.travel("Idle")
func need_to_turn():
var new_facing_direction
if input_direction.x < 0:
new_facing_direction = FacingDirection.LEFT
elif input_direction.x > 0:
new_facing_direction = FacingDirection.RIGHT
elif input_direction.y < 0:
new_facing_direction = FacingDirection.UP
elif input_direction.y > 0:
new_facing_direction = FacingDirection.DOWN
if facing_direction != new_facing_direction:
facing_direction = new_facing_direction
return true
facing_direction = new_facing_direction
return false
func finished_turning():
player_state = PlayerState.IDLE
func entered_door():
emit_signal("player_entered_door_signal")
func move(delta):
var desired_step: Vector2 = input_direction * TILE_SIZE / 2
ray.cast_to = desired_step
ray.force_raycast_update()
ledge_ray.cast_to = desired_step
ledge_ray.force_raycast_update()
door_ray.cast_to = desired_step
door_ray.force_raycast_update()
if door_ray.is_colliding():
if percent_moved_to_next_tile == 0.0:
emit_signal("player_entering_door_signal")
percent_moved_to_next_tile += walk_speed * delta
if percent_moved_to_next_tile >= 1.0:
position = initial_position + (input_direction * TILE_SIZE)
percent_moved_to_next_tile = 0.0
is_moving = false
stop_input = true
$AnimationPlayer.play("Disappear")
$Camera2D.clear_current()
else:
position = initial_position + (TILE_SIZE * input_direction * percent_moved_to_next_tile)
elif (ledge_ray.is_colliding() && input_direction == Vector2(0, 1)) or jumping_over_ledge:
percent_moved_to_next_tile += jump_speed * delta
if percent_moved_to_next_tile >= 2.0:
position = initial_position + (input_direction * TILE_SIZE * 2)
percent_moved_to_next_tile = 0.0
is_moving = false
jumping_over_ledge = false
shadow.visible = false
var dust_effect = LandingDustEffect.instance()
dust_effect.position = position
get_tree().current_scene.add_child(dust_effect)
else:
shadow.visible = true
jumping_over_ledge = true
var input = input_direction.y * TILE_SIZE * percent_moved_to_next_tile
position.y = initial_position.y + (-0.96 - 0.53 * input + 0.05 * pow(input, 2))
elif !ray.is_colliding():
if percent_moved_to_next_tile == 0:
emit_signal("player_moving_signal")
percent_moved_to_next_tile += walk_speed * delta
if percent_moved_to_next_tile >= 1.0:
position = initial_position + (TILE_SIZE * input_direction)
percent_moved_to_next_tile = 0.0
is_moving = false
emit_signal("player_stopped_signal")
else:
position = initial_position + (TILE_SIZE * input_direction * percent_moved_to_next_tile)
else:
is_moving = false