sxipo_fremdulo.gd 9,3 КБ
Newer Older
magcourier's avatar
magcourier включено в состав коммита
1
2
3
4
5
6
extends KinematicBody


# общий скрипт для всех чужих кораблей

var uuid = ""
magcourier's avatar
magcourier включено в состав коммита
7
8
var objekto
var distance = 0 # дистанция до корабля игрока
magcourier's avatar
magcourier включено в состав коммита
9
10
11
var integreco = 100
var potenco

magcourier's avatar
magcourier включено в состав коммита
12
13
14
15
16
var acceleration = 1 # для расчета движения корабля
var target_rot #положение корабля, которое надо принять, чтобы нацелиться на точку.
var speed_rotation =1

# максимальная скорость корабля
magcourier's avatar
magcourier включено в состав коммита
17
18
19
var max_speed =500.0
# текущая скорость
var current_speed =0
magcourier's avatar
magcourier включено в состав коммита
20
21


magcourier's avatar
magcourier включено в состав коммита
22
# uuid проекта маршрута
magcourier's avatar
magcourier включено в состав коммита
23
24
25
var projekto_itineroj
#маршрут движения корабля
var itineroj = [] 
magcourier's avatar
magcourier включено в состав коммита
26
27
# uuid - uuid задачи
# front - transform координат цели движения (лучше высчитать один раз при добавлении)
magcourier's avatar
magcourier включено в состав коммита
28
29
30
31
# координаты цели полёта
#			'koordinatoX':
#			'koordinatoY':
#			'koordinatoZ':
magcourier's avatar
magcourier включено в состав коммита
32
# pozicio - в какой позиции должна находится задача
magcourier's avatar
magcourier включено в состав коммита
33
var pause = false # корабль стоит на паузе
magcourier's avatar
magcourier включено в состав коммита
34
35
36
37

func _ready():
	$CollisionShape.queue_free()

magcourier's avatar
magcourier включено в состав коммита
38
39

func _physics_process(delta):
magcourier's avatar
magcourier включено в состав коммита
40
	if !(itineroj.empty() or pause): #Если цель существует, двигаемся
magcourier's avatar
magcourier включено в состав коммита
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#		print('летит объект = ',uuid)
		var front = Transform(Basis.IDENTITY,Vector3(itineroj.front()['koordinatoX'],
			itineroj.front()['koordinatoY'], itineroj.front()['koordinatoZ']))
		var target_dir = (front.origin - translation).normalized()
		var distance = translation.distance_to(front.origin)
		if len (itineroj)>1:
			if distance <1: #Если это не последняя точка, то мы не тормозим, так что завышаем расстояние, чтобы не проскочить эту точку
				dec_route()
				return
			current_speed = lerp(current_speed,max_speed,delta*acceleration)#ускоряемся
			transform.basis = transform.basis.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
		else:
			if distance > max_speed*delta/acceleration:#Тут сомнительная формула от фонаря, вычисляющая примерно откуда надо начинать тормозить корабль.
				current_speed = lerp(current_speed,max_speed,delta*acceleration)#ускоряемся
magcourier's avatar
magcourier включено в состав коммита
55
56
57
58
				var a = Quat(transform.basis)
				var c = a.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
				transform.basis = Basis(c)
#				transform.basis = transform.basis.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
magcourier's avatar
magcourier включено в состав коммита
59
60
61
62
63
64
65
66
67
68
69
70
71
			else: #Если это  последняя точка, то мы тормозим, и задаём минимальное расстояние, чтобы точнее выставить корабль
				current_speed = lerp(current_speed,50,delta*acceleration)#замедляемся
				if front.basis !=Basis.IDENTITY:
					transform.basis = transform.basis.slerp(Quat(front.basis),speed_rotation*delta*1.5) #поворачиваем в дефолтное состояние, чтобы сесть
				if distance <0.01:
					if front.basis !=Basis.IDENTITY:
						transform.basis = front.basis
					translation = front.origin
					route_gone()
					return
#		print(distance,": ",current_speed)
#		print(len(itineroj))
#		print('двигаемся = ',target_dir*delta*current_speed)
magcourier's avatar
magcourier включено в состав коммита
72
# warning-ignore:return_value_discarded
magcourier's avatar
magcourier включено в состав коммита
73
74
75
		move_and_slide(target_dir*delta*current_speed) #Двигаемся к цели  и тут можно передать transform на сервер


magcourier's avatar
magcourier включено в состав коммита
76
77
78
79
80
81
func rotate_start():# поворачиваем корабль носом по ходу движения
	var front = Transform(Basis.IDENTITY, Vector3(itineroj.front()['koordinatoX'],
		itineroj.front()['koordinatoY'], itineroj.front()['koordinatoZ']))
	target_rot = Quat(transform.looking_at(front.origin,Vector3.UP).basis) #запоминаем в какое положение надо установить корабль, чтобы нос был к цели. Это в кватернионах. ХЗ что это, но именно так вращать правильнее всего.


magcourier's avatar
magcourier включено в состав коммита
82
83
84
85
86
func set_route(route_array):
	if !route_array.empty():
		itineroj.clear() #Просто приравнивать нельзя, так как изменяется адрес и если где-то на него кто-то ссылался в других сценах, то он теряет этот адрес Так что очищаем и копируем.
		for i in route_array:
			itineroj.push_back(i)
magcourier's avatar
magcourier включено в состав коммита
87
88
		rotate_start()

magcourier's avatar
magcourier включено в состав коммита
89
90
91
92
93

func dec_route():
	itineroj.pop_front()
	set_route(itineroj.duplicate())

magcourier's avatar
magcourier включено в состав коммита
94

magcourier's avatar
magcourier включено в состав коммита
95
96
97
98
99
100
101
102
func route_gone():
	itineroj.clear()

func add_route(route_array):
	for i in route_array:
		itineroj.push_back(i)
	set_route(itineroj.duplicate())

magcourier's avatar
magcourier включено в состав коммита
103
104
105
106
107
108
109

# редактировать маршрут
func sxangxi_itinero(projekto, tasko):
	if projekto['uuid']==projekto_itineroj: # изменение по задаче в текущем проекте
		var new_tasko = true # признак необходимости новой задачи
		var pos = 0 # номер позиции в списке задач
		for it in itineroj:# проходим по всем задачам
magcourier's avatar
magcourier включено в состав коммита
110
			if tasko['uuid'] == it['uuid']: # нашли соответствующую задачу
magcourier's avatar
magcourier включено в состав коммита
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
				new_tasko = false
				if tasko['statuso']['objId']==1: # новая -  в очередь выполнения 
					it['koordinatoX'] = tasko['finKoordinatoX']
					it['koordinatoY'] = tasko['finKoordinatoY']
					it['koordinatoZ'] = tasko['finKoordinatoZ']
				elif tasko['statuso']['objId']==2: # в работе
					# задача должна быть первой в списке
					if pos: # если не первая
						itineroj.remove(pos)
						itineroj.push_front({
							'uuid':tasko['uuid'],
							'koordinatoX':tasko['finKoordinatoX'],
							'koordinatoY':tasko['finKoordinatoY'],
							'koordinatoZ':tasko['finKoordinatoZ']
						})
					else:
						it['koordinatoX'] = tasko['finKoordinatoX']
						it['koordinatoY'] = tasko['finKoordinatoY']
						it['koordinatoZ'] = tasko['finKoordinatoZ']
					# отправляем корабль на уточнённые координаты, а точнее поворачиваем
					rotate_start()
					pause = false
				elif tasko['statuso']['objId']==4: # закрыта
					#удаляем из списка
					itineroj.remove(pos)
				elif tasko['statuso']['objId']==6: # приостановлена
					pause = true
			pos += 1
		if new_tasko: # добавляем новую задачу в проект
magcourier's avatar
magcourier включено в состав коммита
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
179
180
181
182
183
184
185
			if tasko['statuso']['objId']==1: # новая -  в очередь выполнения 
				# нужно выстроить по очерёдности
				pass
				pos = 0
				var pozicio = false
				for it in itineroj:# проходим по всем задачам и находим нужную позицию
					if itineroj['pozicio']>tasko['pozicio']: # вставляем перед данной записью
						itineroj.insert(pos, {
							'uuid':tasko['uuid'],
							'koordinatoX': tasko['finKoordinatoX'],
							'koordinatoY': tasko['finKoordinatoY'],
							'koordinatoZ': tasko['finKoordinatoZ'],
							'pozicio': tasko['pozicio']
						})
						pozicio = true
						break
					pos += 1
				if !pozicio: # позиция не найдены, добавляем в конце
					itineroj.push_pop({
						'uuid':tasko['uuid'],
						'koordinatoX': tasko['finKoordinatoX'],
						'koordinatoY': tasko['finKoordinatoY'],
						'koordinatoZ': tasko['finKoordinatoZ'],
						'pozicio': tasko['pozicio']
					})
			elif tasko['statuso']['objId']==2: # в работе
					# задача должна быть первой в списке
				itineroj.push_front({
					'uuid':tasko['uuid'],
					'koordinatoX':tasko['finKoordinatoX'],
					'koordinatoY':tasko['finKoordinatoY'],
					'koordinatoZ':tasko['finKoordinatoZ'],
					'pozicio': tasko['pozicio']
				})
					# отправляем корабль на уточнённые координаты, а точнее поворачиваем
				rotate_start()
				pause = false
			elif tasko['statuso']['objId']==6: # приостановлена
				itineroj.push_front({
					'uuid':tasko['uuid'],
					'koordinatoX': tasko['finKoordinatoX'],
					'koordinatoY': tasko['finKoordinatoY'],
					'koordinatoZ': tasko['finKoordinatoZ'],
					'pozicio': tasko['pozicio']
				})
				pause = true
magcourier's avatar
magcourier включено в состав коммита
186
	else: # первая запись нового проекта
magcourier's avatar
magcourier включено в состав коммита
187
188
189
190
191
192
193
194
195
196
197
198
199
200
		route_gone()
		projekto_itineroj = projekto['uuid']
		itineroj.push_back({
			'uuid':tasko['uuid'],
			'koordinatoX': tasko['finKoordinatoX'],
			'koordinatoY': tasko['finKoordinatoY'],
			'koordinatoZ': tasko['finKoordinatoZ'],
			'pozicio': tasko['pozicio']
		})
		if tasko['statuso']['objId']==2: # в работе
			rotate_start()
			pause = false
		else:
			pause = true
magcourier's avatar
magcourier включено в состав коммита
201