123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- extends ServiceBase
- #
- var mainCamera : Camera2D = null
- var sceneCamera : Camera2D = null
- var minPos : Vector2 = Vector2.ZERO
- var maxPos : Vector2 = Vector2.ONE
- var lastZoomLevel : int = ActorCommons.CameraZoomDefault
- var zoomLevel : int = ActorCommons.CameraZoomDefault
- var zoomSceneTween : Tween = null
- var zoomMainTween : Tween = null
- var zoomTimer : Timer = null
- #
- func SetBoundaries():
- if Launcher.Map:
- var mapBoundaries : Rect2i = Launcher.Map.GetMapBoundaries()
- minPos = mapBoundaries.position
- maxPos = mapBoundaries.end
- if mainCamera:
- mainCamera.limit_left = int(mapBoundaries.position.x)
- mainCamera.limit_right = int(mapBoundaries.end.x)
- mainCamera.limit_top = int(mapBoundaries.position.y)
- mainCamera.limit_bottom = int(mapBoundaries.end.y)
- mainCamera.set_global_position(Vector2.ZERO)
- if sceneCamera:
- sceneCamera.limit_left = int(mapBoundaries.position.x)
- sceneCamera.limit_right = int(mapBoundaries.end.x)
- sceneCamera.limit_top = int(mapBoundaries.position.y)
- sceneCamera.limit_bottom = int(mapBoundaries.end.y)
- sceneCamera.set_global_position(Vector2.ZERO)
- func EnableSceneCamera(pos : Vector2):
- if not sceneCamera:
- return
- var enableSmoothing : bool = sceneCamera.get_global_position() != Vector2.ZERO
- sceneCamera.set_position_smoothing_enabled(enableSmoothing)
- sceneCamera.set_global_position(pos)
- sceneCamera.set_enabled(true)
- sceneCamera.make_current()
- func DisableSceneCamera():
- sceneCamera.set_enabled(false)
- func IsZooming(level : int) -> bool:
- return zoomLevel == level
- func ZoomAt(level : int):
- zoomLevel = clampi(level, 0, ActorCommons.CameraZoomLevels.size() - 1)
- UpdateZoom()
- func ZoomIn():
- if not zoomTimer:
- zoomLevel = clampi(zoomLevel + 1, 0, ActorCommons.CameraZoomLevels.size() - 1)
- UpdateZoom()
- func ZoomOut():
- if not zoomTimer:
- zoomLevel = clampi(zoomLevel - 1, 0, ActorCommons.CameraZoomLevels.size() - 1)
- UpdateZoom()
- func ZoomReset():
- if not zoomTimer:
- zoomLevel = ActorCommons.CameraZoomDefault
- UpdateZoom()
- func ZoomTweenCompleted(isMainCamera : bool):
- if isMainCamera:
- zoomMainTween = null
- else:
- zoomSceneTween = null
- func ZoomTimerCompleted():
- zoomTimer = null
- func UpdateZoom():
- if zoomLevel == lastZoomLevel:
- return
- lastZoomLevel = zoomLevel
- zoomTimer = Callback.SelfDestructTimer(mainCamera, ActorCommons.CameraZoomDelay / 2.0, ZoomTimerCompleted, [], "ZoomTimer")
- if zoomLevel < 0 or zoomLevel >= ActorCommons.CameraZoomLevels.size():
- assert(false, "Trying to set a wrong zoom level to our camera(s)")
- return
- var zoomVector : Vector2 = ActorCommons.CameraZoomLevels[zoomLevel]
- if zoomSceneTween:
- zoomSceneTween.kill()
- zoomSceneTween = sceneCamera.create_tween()
- zoomSceneTween.tween_property(sceneCamera, "zoom", zoomVector, ActorCommons.CameraZoomDelay).from(sceneCamera.zoom)
- zoomSceneTween.play()
- zoomSceneTween.tween_callback(ZoomTweenCompleted.bind(false))
- if zoomMainTween:
- zoomMainTween.kill()
- zoomMainTween = mainCamera.create_tween()
- zoomMainTween.tween_property(mainCamera, "zoom", zoomVector, ActorCommons.CameraZoomDelay).from(mainCamera.zoom)
- zoomMainTween.play()
- zoomMainTween.tween_callback(ZoomTweenCompleted.bind(true))
- func SyncPlayerPosition():
- if Launcher.Player and mainCamera:
- var enableSmoothing : bool = mainCamera.get_global_position() != Vector2.ZERO
- mainCamera.set_position_smoothing_enabled(enableSmoothing)
- mainCamera.set_position(Launcher.Player.get_position())
- #
- func _post_launch():
- if Launcher.Map:
- if not Launcher.Map.MapLoaded.is_connected(SetBoundaries):
- Launcher.Map.MapLoaded.connect(SetBoundaries)
- if not Launcher.Map.PlayerWarped.is_connected(SyncPlayerPosition):
- Launcher.Map.PlayerWarped.connect(SyncPlayerPosition)
- if Launcher.Scene:
- var cameraPreset : PackedScene = FileSystem.LoadEntityComponent("Camera", false)
- sceneCamera = cameraPreset.instantiate()
- sceneCamera.set_name("SceneCamera")
- if sceneCamera:
- Launcher.Scene.add_child.call_deferred(sceneCamera)
- mainCamera = cameraPreset.instantiate()
- mainCamera.set_name("MainCamera")
- if mainCamera:
- Launcher.Scene.add_child.call_deferred(mainCamera)
- isInitialized = true
- func Destroy():
- if Launcher.Scene:
- if sceneCamera:
- sceneCamera.queue_free()
- sceneCamera = null
- if mainCamera:
- mainCamera.queue_free()
- mainCamera = null
|