blob: b9bcd169e480d234a0af47cdf88aa807b24f27a1 (
plain)
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
|
extends CharacterBody2D
const SPEED = 450
const JUMPFORCE = -500
const GRAVITY = 20
const RUNSPEED = SPEED * 2
const WALLJUMPFORCE = JUMPFORCE * 0.75
const WALLJUMPSPEED = SPEED * 8
var direction = Enum.DIRECTION.RIGHT
var canDoubleJump = false
var hasPlayedFallStop = false
var jumpHeightModifier = 0
var wasOnWall = false
var lastWallDirection = Enum.DIRECTION.LEFT
func _ready():
pass
func _physics_process(delta):
if Input.is_action_pressed("DIRECTION_LEFT"):
velocity.x = -SPEED
direction = Enum.DIRECTION.LEFT
$Sprite2D.flip_h = true
if self.is_running():
velocity.x = -RUNSPEED
elif Input.is_action_pressed("DIRECTION_RIGHT"):
velocity.x = SPEED
direction = Enum.DIRECTION.RIGHT
$Sprite2D.flip_h = false
if self.is_running():
velocity.x = RUNSPEED
set_up_direction(Vector2.UP)
if is_on_floor():
if Input.is_action_pressed("DIRECTION_LEFT") or Input.is_action_pressed("DIRECTION_RIGHT"):
if self.is_running():
$Sprite2D.play("run")
else:
$Sprite2D.play("walk")
else:
$Sprite2D.play("idle")
# jump and fall animation
if not is_on_floor():
$Sprite2D.play("jump")
if has_node("CheckFallStop"):
if velocity.y > -JUMPFORCE:
$CheckFallLanding.set_enabled(true)
$CheckFallStop.set_enabled(true)
if $CheckFallLanding.is_colliding():
$Sprite2D.play("fall_stop_landing")
elif $CheckFallStop.is_colliding():
$Sprite2D.play("fall_stop")
else:
$Sprite2D.play("fall")
else:
$CheckFallLanding.set_enabled(false)
$CheckFallStop.set_enabled(true)
# fall down
velocity.y += GRAVITY
# jump
if Input.is_action_just_pressed("JUMP"):
if is_on_floor():
canDoubleJump = true
velocity.y = JUMPFORCE
jumpHeightModifier = JUMPFORCE
elif not is_on_floor() and not is_on_wall() and not wasOnWall and canDoubleJump:
canDoubleJump = false
velocity.y = JUMPFORCE
if Input.is_action_pressed("JUMP"):
jumpHeightModifier += 10
if jumpHeightModifier > 0:
jumpHeightModifier = 0
if Input.is_action_just_released("JUMP"):
velocity.y -= jumpHeightModifier
if is_on_wall() and not is_on_floor():
velocity.y *= 0.8
$Sprite2D.play("wall")
wasOnWall = true
lastWallDirection = direction
if not is_on_wall() and wasOnWall:
wasOnWall = false
$WalljumpTimer.start()
if canWallJump() and Input.is_action_just_pressed("JUMP"):
$WalljumpTimer.stop()
velocity.y = WALLJUMPFORCE
if lastWallDirection == Enum.DIRECTION.LEFT:
velocity.x = WALLJUMPSPEED
$Sprite2D.flip_h = false
elif lastWallDirection == Enum.DIRECTION.RIGHT:
velocity.x = -WALLJUMPSPEED
$Sprite2D.flip_h = true
# stop
velocity = velocity.lerp(Vector2(0, velocity.y), 0.7)
move_and_slide()
func is_running():
return Input.is_action_pressed("RUN") and is_on_floor()
func canWallJump():
return (is_on_wall() and not is_on_floor()) or not $WalljumpTimer.is_stopped()
func check_flag():
# $Sprite.play("dance anim")
print("FLAG CHECKED")
|