[f7b09c8] | 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)
|
---|