way_point.gd 3,6 КБ
Newer Older
magcourier's avatar
magcourier включено в состав коммита
1
2
3
4
5
6
7
8
9
extends Spatial
var cam #камера
var offset #сдвиг кнотрол-нод от нуля. Почему-то без него никак, хотя должно бы
var right_mouse_pressed = false #флаг правой мыши
export var z_away = 100 # насколько глубоко\далеко будет точка пути от экрана
export var colision_radius = 2.0 #радиус, на который надо подлететь к точке пути, чтобы она обнулилась

var active = false # есть ли точка пути, или ничего не указано

magcourier's avatar
magcourier включено в состав коммита
10
# warning-ignore:unused_signal
magcourier's avatar
magcourier включено в состав коммита
11
12
13
14
15
16
17
signal new_way_point(position) # сигнал кораблю, что пора лететь в точку position

func _ready():
	cam = get_tree().get_root().get_camera() # получаем камеру
	offset =Vector2($TextureRect.rect_size/2) # получаем смещение контрол-нод в центр
	$Area/CollisionShape.shape.radius = colision_radius #задаём радиус обнуления вейпойнта.

magcourier's avatar
magcourier включено в состав коммита
18
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
19
func _input(event):
magcourier's avatar
magcourier включено в состав коммита
20
21
22
23
#	if Input.is_action_just_pressed("left_click"):
#		if event is InputEventMouseButton and event.doubleclick:
#			emit_signal("new_way_point",cam.project_position(get_viewport().get_mouse_position(),z_away),null) #Если кнопка нажата, то бросаем лучь из камеры на глубину z_away и получаем точку, тут же устанавливаем новый вейпойнт с координатами
	pass
magcourier's avatar
magcourier включено в состав коммита
24
			
magcourier's avatar
magcourier включено в состав коммита
25
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
26
27
28
func _physics_process(delta):
	$TextureRect.rect_position = cam.unproject_position(translation) - offset #Эта секретная магия выводит ноду контрол именно там, где находится объект в зд-мире. Очень полезно.

magcourier's avatar
magcourier включено в состав коммита
29
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
func _on_Area_body_entered(body): #Если кто-то влетел в область вейпойнта
	set_active(false) #выключаем вейпойнт.

func set_active(on):
	active = on
	$TextureRect.visible = on
	if !on:
		translation = Vector3.ZERO #сбрасываем в ноль выключенный вейпойнт. Потому что если этого не делать, то после того, как новый вейпйнт будет создан на том же месте, события "area_entered" не произойдёт, ибо никто из области и не выходил и корабль полетит дальше, оставив ваейпойнт позади

func set_way_point(position): #ставим точку вейпойнта.
	set_active(false)#сбрасываем вейпойнт
	translation = position #ставим точку вейпойнта в полученные координаты.
	set_active(true) #активируем вейпойнт (включаем иконку)
	

magcourier's avatar
magcourier включено в состав коммита
45
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
46
47
48
49
func _on_VisibilityNotifier_camera_entered(camera): # Так как контрол-ноды в зд-мире (а они изначально 2д) видны не только напрямую, но и если обернуться на 180 градусов, то проверяем видимость именно зд -объекта. И только тогда рисум контрол-ноду. Если вейпойнт существует.
	if active:
		$TextureRect.visible = true

magcourier's avatar
magcourier включено в состав коммита
50
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
51
52
func _on_VisibilityNotifier_camera_exited(camera):
	$TextureRect.visible = false