Camera.gd 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. extends ServiceBase
  2. #
  3. var mainCamera : Camera2D = null
  4. var sceneCamera : Camera2D = null
  5. var minPos : Vector2 = Vector2.ZERO
  6. var maxPos : Vector2 = Vector2.ONE
  7. var lastZoomLevel : int = ActorCommons.CameraZoomDefault
  8. var zoomLevel : int = ActorCommons.CameraZoomDefault
  9. var zoomSceneTween : Tween = null
  10. var zoomMainTween : Tween = null
  11. var zoomTimer : Timer = null
  12. #
  13. func SetBoundaries():
  14. if Launcher.Map:
  15. var mapBoundaries : Rect2i = Launcher.Map.GetMapBoundaries()
  16. minPos = mapBoundaries.position
  17. maxPos = mapBoundaries.end
  18. if mainCamera:
  19. mainCamera.limit_left = int(mapBoundaries.position.x)
  20. mainCamera.limit_right = int(mapBoundaries.end.x)
  21. mainCamera.limit_top = int(mapBoundaries.position.y)
  22. mainCamera.limit_bottom = int(mapBoundaries.end.y)
  23. mainCamera.set_global_position(Vector2.ZERO)
  24. if sceneCamera:
  25. sceneCamera.limit_left = int(mapBoundaries.position.x)
  26. sceneCamera.limit_right = int(mapBoundaries.end.x)
  27. sceneCamera.limit_top = int(mapBoundaries.position.y)
  28. sceneCamera.limit_bottom = int(mapBoundaries.end.y)
  29. sceneCamera.set_global_position(Vector2.ZERO)
  30. func EnableSceneCamera(pos : Vector2):
  31. if not sceneCamera:
  32. return
  33. var enableSmoothing : bool = sceneCamera.get_global_position() != Vector2.ZERO
  34. sceneCamera.set_position_smoothing_enabled(enableSmoothing)
  35. sceneCamera.set_global_position(pos)
  36. sceneCamera.set_enabled(true)
  37. sceneCamera.make_current()
  38. func DisableSceneCamera():
  39. sceneCamera.set_enabled(false)
  40. func IsZooming(level : int) -> bool:
  41. return zoomLevel == level
  42. func ZoomAt(level : int):
  43. zoomLevel = clampi(level, 0, ActorCommons.CameraZoomLevels.size() - 1)
  44. UpdateZoom()
  45. func ZoomIn():
  46. if not zoomTimer:
  47. zoomLevel = clampi(zoomLevel + 1, 0, ActorCommons.CameraZoomLevels.size() - 1)
  48. UpdateZoom()
  49. func ZoomOut():
  50. if not zoomTimer:
  51. zoomLevel = clampi(zoomLevel - 1, 0, ActorCommons.CameraZoomLevels.size() - 1)
  52. UpdateZoom()
  53. func ZoomReset():
  54. if not zoomTimer:
  55. zoomLevel = ActorCommons.CameraZoomDefault
  56. UpdateZoom()
  57. func ZoomTweenCompleted(isMainCamera : bool):
  58. if isMainCamera:
  59. zoomMainTween = null
  60. else:
  61. zoomSceneTween = null
  62. func ZoomTimerCompleted():
  63. zoomTimer = null
  64. func UpdateZoom():
  65. if zoomLevel == lastZoomLevel:
  66. return
  67. lastZoomLevel = zoomLevel
  68. zoomTimer = Callback.SelfDestructTimer(mainCamera, ActorCommons.CameraZoomDelay / 2.0, ZoomTimerCompleted, [], "ZoomTimer")
  69. if zoomLevel < 0 or zoomLevel >= ActorCommons.CameraZoomLevels.size():
  70. assert(false, "Trying to set a wrong zoom level to our camera(s)")
  71. return
  72. var zoomVector : Vector2 = ActorCommons.CameraZoomLevels[zoomLevel]
  73. if zoomSceneTween:
  74. zoomSceneTween.kill()
  75. zoomSceneTween = sceneCamera.create_tween()
  76. zoomSceneTween.tween_property(sceneCamera, "zoom", zoomVector, ActorCommons.CameraZoomDelay).from(sceneCamera.zoom)
  77. zoomSceneTween.play()
  78. zoomSceneTween.tween_callback(ZoomTweenCompleted.bind(false))
  79. if zoomMainTween:
  80. zoomMainTween.kill()
  81. zoomMainTween = mainCamera.create_tween()
  82. zoomMainTween.tween_property(mainCamera, "zoom", zoomVector, ActorCommons.CameraZoomDelay).from(mainCamera.zoom)
  83. zoomMainTween.play()
  84. zoomMainTween.tween_callback(ZoomTweenCompleted.bind(true))
  85. func SyncPlayerPosition():
  86. if Launcher.Player and mainCamera:
  87. var enableSmoothing : bool = mainCamera.get_global_position() != Vector2.ZERO
  88. mainCamera.set_position_smoothing_enabled(enableSmoothing)
  89. mainCamera.set_position(Launcher.Player.get_position())
  90. #
  91. func _post_launch():
  92. if Launcher.Map:
  93. if not Launcher.Map.MapLoaded.is_connected(SetBoundaries):
  94. Launcher.Map.MapLoaded.connect(SetBoundaries)
  95. if not Launcher.Map.PlayerWarped.is_connected(SyncPlayerPosition):
  96. Launcher.Map.PlayerWarped.connect(SyncPlayerPosition)
  97. if Launcher.Scene:
  98. var cameraPreset : PackedScene = FileSystem.LoadEntityComponent("Camera", false)
  99. sceneCamera = cameraPreset.instantiate()
  100. sceneCamera.set_name("SceneCamera")
  101. if sceneCamera:
  102. Launcher.Scene.add_child.call_deferred(sceneCamera)
  103. mainCamera = cameraPreset.instantiate()
  104. mainCamera.set_name("MainCamera")
  105. if mainCamera:
  106. Launcher.Scene.add_child.call_deferred(mainCamera)
  107. isInitialized = true
  108. func Destroy():
  109. if Launcher.Scene:
  110. if sceneCamera:
  111. sceneCamera.queue_free()
  112. sceneCamera = null
  113. if mainCamera:
  114. mainCamera.queue_free()
  115. mainCamera = null