1 | #extends Camera
|
---|
2 |
|
---|
3 | # enum = {
|
---|
4 | # MODE_PLAYER,
|
---|
5 | # MODE_FOLLOW,
|
---|
6 | # MODE_ZOOM
|
---|
7 | #}
|
---|
8 |
|
---|
9 | #const SNAP_DISTANCE = 0.05
|
---|
10 | #const TARGET_VECTOR = Vector3(0,0,-1) # Targeting vector/angle, relative to target node. Multiplied by "distance".
|
---|
11 | #const MIN_DISTANCE = 0.5
|
---|
12 | #const MAX_DISTANCE = 2.5
|
---|
13 | #const UP = Vector3(0,1,0)
|
---|
14 |
|
---|
15 | #export var speed = 2.0
|
---|
16 |
|
---|
17 | #var anchor # To bring the camera back once it needs to. (Transform)
|
---|
18 | #var target # Node to follow or zoom on. (Node)
|
---|
19 | #var distance # Distance when zooming in or out. (float)
|
---|
20 | #var mode # Currently active mode. (int)
|
---|
21 |
|
---|
22 | #func follow(target_node):
|
---|
23 | # if !is_processing():
|
---|
24 | # anchor = transform
|
---|
25 | # set_process(true)
|
---|
26 | # distance = 1.0
|
---|
27 | # target = target_node
|
---|
28 | # mode = MODE_FOLLOW
|
---|
29 |
|
---|
30 | #func zoom(target_node):
|
---|
31 | # if !is_processing():
|
---|
32 | # anchor = transform
|
---|
33 | # set_process(true)
|
---|
34 | # distance = 1.0
|
---|
35 | # target = target_node
|
---|
36 | # mode = MODE_ZOOM
|
---|
37 |
|
---|
38 | #func go_to_player():
|
---|
39 | # target = null
|
---|
40 | # mode = MODE_PLAYER
|
---|
41 | # set_process(true)
|
---|
42 |
|
---|
43 | #func snap_to_player():
|
---|
44 | # transform = anchor
|
---|
45 | # set_process(false)
|
---|
46 |
|
---|
47 | #func _ready():
|
---|
48 | # set_process(false)
|
---|
49 | # mode = MODE_PLAYER
|
---|
50 | # anchor = transform
|
---|
51 | # distance = 1.0
|
---|
52 |
|
---|
53 | #func _process(delta): match mode:
|
---|
54 | # MODE_PLAYER:
|
---|
55 | # var newTransform = transform.interpolate_with(anchor, delta * speed)
|
---|
56 | # if newTransform.origin.distance_to(anchor.origin) < SNAP_DISTANCE:
|
---|
57 | # transform = anchor
|
---|
58 | # set_process(false)
|
---|
59 | # else:
|
---|
60 | # transform = newTransform
|
---|
61 | # MODE_FOLLOW:
|
---|
62 | # distance = clamp(distance + delta / 8, 1.0, MAX_DISTANCE)
|
---|
63 | # var targetTransform = target.global_transform
|
---|
64 | # targetTransform.origin += targetTransform.basis.xform(TARGET_VECTOR * distance)
|
---|
65 | # global_transform = global_transform.interpolate_with(targetTransform, delta * speed)
|
---|
66 | # look_at(target, UP)
|
---|
67 | # MODE_ZOOM:
|
---|
68 | # distance = clamp(distance - delta / 4, MIN_DISTANCE, 1.0)
|
---|
69 | # var targetTransform = target.global_transform
|
---|
70 | # targetTransform.origin += targetTransform.basis.xform(TARGET_VECTOR * distance)
|
---|
71 | # global_transform = global_transform.interpolate_with(targetTransform, delta * speed)
|
---|
72 | # look_at(target, UP)
|
---|