-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKinematicPlayer.gd
169 lines (144 loc) · 7.53 KB
/
KinematicPlayer.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
extends KinematicBody2D
const SPEED:int = 200 # Скорость передвижения игрока
var movedir = Vector2(0,0) # Текущее направляение движения
var spritedir:String = "down" # Направление персонажа
var can_go:bool = true
var can_fire:bool = false
var how_fire = Vector2()
var fire_rotate = 0
var time:float = 5
var shoot_time = 1
var is_live:bool = true
var is_moving:bool = false
var health = 40 # ХП изначально
var mana = 100 # Мана изначально
var manaMAX:int = 100
var healthMAX:int = 100
var HealthRegenSpeed:int = 1 # Скорость регенерации маны
var ManaRegenSpeed:int = 10 # Скорость регенерации маны
var FireBallCost:int = 30 # Цена файрболла в мане
var FireDamage:int = 5 # Урон персу от файрболла
var Bullet = preload('res://player/Bullet.tscn') # В переменную Bullet пдгружаем сцену Bullet.tscn
func fire(): # Функция выстрела файрболлом
if (mana > 30): # Тут и так всё ясно
mana -= FireBallCost # Тут тоже, просто убираем цену выстрела
var bul = Bullet.instance() # Хз что это, но оно работает
bul.position = position + how_fire # Задаём начальное местоположение огня у рук перса
bul.rotation_degrees = fire_rotate # Направляем патрону в ту сторону куда смотрит перс
get_node('../').add_child(bul) # В ноде на уровень выше создаем файрболл
time = 0
func _physics_process(delta): # Функция выполняется всегда
controls_loop() # Функция управлением перса, можно было просто вставить весь код из функции сюда, но так читабельнее
movement_loop() # То же
spritedir_loop() # То же
fire_loop() # То же
time += delta # Счётчик временеи
if (mana < manaMAX): # Если кол-во маны не 100, то
mana += delta * ManaRegenSpeed #Регенерация маны
if (mana > manaMAX):
mana = manaMAX
if (health < healthMAX && is_moving == false): # Если кол-во маны не 100 и перс не движется, то
health += delta * HealthRegenSpeed #Регенерация жизней
if(health > healthMAX):
health = healthMAX
if (time > shoot_time): # Не помню зачем делал, пока работает не надо трогать. Это связано с выстрелом файрболла
time = 5
$"../"/Bars/Player_bars/player1_mana_bar.set_value(mana) # Установка значения mana на полосу маны (синяя на экране)
$"../"/Bars/Player_bars/player1_health_bar.set_value(health) # Установка значения health на полосу жизней (красная на экране)
if (health == 0): # Если жизни по нулям
health = -1 # Минусуем их
time = 0 # Обнуляем таймер
is_live = false # Значение что перс жив стало false
$"../"/EndGameScreen/CanvasLayer/Label.show() # Показываем лейбл о том, что игра окончена
if (time > 1.4 and is_live == false): # Если лейбл провисел на экране больше 1.4 секунды
get_tree().paused = true # Останвливаем всю игру
func fire_loop():
if (Input.is_action_pressed("ui_fire")): # Если нажата клавиша ui_fire сейчас это шифт
# Если перс смортит влево
if spritedir == "left":# and test_move(transform, Vector2(-1,0)):
$anim.play("pushleft") # Начинаем проигрывать анимацию наклона
can_go = false # Не может двигаться
can_fire = false # Не может стрелять
fire_rotate = -180 # Изменаем поворот файрболла
how_fire = Vector2(-10, 2) # Указываем куда файрболлу лететь
if (time > shoot_time): # Если по времени можно выстреливать, то
fire() # ОГОНЬ!
#anim_switch("push")
# Дальше то же самое
if spritedir == "right":# and test_move(transform, Vector2(1,0)):
$anim.play("pushright")
can_go = false
can_fire = false
fire_rotate = 0
how_fire = Vector2(10, 2)
if (time > shoot_time):
fire()
#anim_switch("push")
if spritedir == "up":# and test_move(transform, Vector2(0,-1)):
$anim.play("pushup")
can_go = false
can_fire = false
fire_rotate = -90
how_fire = Vector2(0, -10)
if (time > shoot_time):
fire()
#anim_switch("push")
if spritedir == "down":# and test_move(transform, Vector2(0,1)):
$anim.play("pushdown")
can_go = false
can_fire = false
fire_rotate = 90
how_fire = Vector2(0, 10)
if (time > shoot_time):
fire()
#anim_switch("push")
elif movedir != Vector2(0,0): # Если вектор движения перса не нулевой, те. перс движется
anim_switch("walk") # Меняем его анимацию на анимацию хождения
can_go = true # Он может идти
can_fire = true # Может стрелять
is_moving = true # Запоминаем что перс движетя
else: # В противном случае
anim_switch("idle") # Меняем анимацию на анимацию ничего не делания
can_go = true # Он может идти
can_fire = true # Может стрелять
is_moving = false # Запоминаем что перс стоит
func controls_loop():
# Переменные ранящие в себе значения клавиш, true - нажата, false - не нажата
var LEFT = Input.is_action_pressed("ui_left")
var RIGHT = Input.is_action_pressed("ui_right")
var UP = Input.is_action_pressed("ui_up")
var DOWN = Input.is_action_pressed("ui_down")
if (can_fire == false): # Если перс стреляет
movedir.x = 0 # Перемещения по x нет
movedir.y = 0 # Перемещения по y нет
if (can_go == true): # Если перс может идти
movedir.x = -int(LEFT) + int(RIGHT) # Устанавливаем куда идёт перс по x
movedir.y = -int(UP) + int(DOWN) # Устанавливаем куда идёт перс по y
func movement_loop():
var motion = movedir.normalized() * SPEED # normalized - усредняем движение перса, можно убрать, но ходить он будет не очень
move_and_slide(motion, Vector2(0,0)) # Перемещаемся
func spritedir_loop(): # Функция устанавливает то куда смотрит перс
match movedir:
Vector2(-1,0):
spritedir = "left"
Vector2(1,0):
spritedir = "right"
Vector2(0,-1):
spritedir = "up"
Vector2(0,1):
spritedir = "down"
func anim_switch(animation): # Функция смены анимации, что бы укоротить код
var newanim = str(animation, spritedir)
if $anim.current_animation != newanim:
$anim.play(newanim)
func go_to_world(worldname): # Функция смены мира
$"../".change_map(worldname)
GLOBAL.scene_name = worldname
func FireBallDamage():
health -= FireDamage
func use_hint(what):
match what:
"Hide":
$"../"/Bars/Hints/Use.hide()
"Show":
$"../"/Bars/Hints/Use.show()