camera.gd 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. extends Camera2D
  2. signal camera_moved
  3. var SPEED = 4000
  4. var DRAG_SPEED = 4.0
  5. var ZOOM_SPEED = 12.0
  6. var BASE_MAX_ZOOM = 1.0
  7. var BASE_MIN_ZOOM = 0.15
  8. var max_zoom = 1.0
  9. var min_zoom = 0.15
  10. var previous_mouse_position = Vector2(-1, -1)
  11. @onready var previous_position: Vector2 = get_screen_center_position()
  12. @onready var current_zoom = get_zoom().x
  13. func _ready():
  14. update_sound_players()
  15. update_zoom_values()
  16. get_tree().get_root().get_child(0).connect("item_rect_changed", update_zoom_values)
  17. func _input(event: InputEvent):
  18. if event is InputEventMouseMotion and Input.is_action_pressed("screen_drag"):
  19. # if previous_mouse_position == Vector2(-1, -1):
  20. # previous_mouse_position = get_viewport().get_mouse_position()
  21. # Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
  22. #set_screen_center_position(center - event.relative * DRAG_SPEED)
  23. var pos = get_target_position() - event.relative * DRAG_SPEED
  24. set_position(pos)
  25. fix_borders()
  26. #move_local_x(-event.relative.x * DRAG_SPEED)
  27. #move_local_y(-event.relative.y * DRAG_SPEED)
  28. # elif previous_mouse_position != Vector2(-1, -1):
  29. # Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
  30. # get_viewport().warp_mouse(previous_mouse_position)
  31. # previous_mouse_position = Vector2(-1, -1)
  32. func _process(delta):
  33. #print(get_screen_center_position(), " ", get_position(), " ", get_target_position())
  34. var pos = get_tree().get_root().get_mouse_position()
  35. if pos.x < 20:
  36. #move_local_x(delta * -SPEED)
  37. pass
  38. if Input.is_action_just_released("zoom_in"):
  39. current_zoom *= (1 + delta * ZOOM_SPEED)
  40. current_zoom = min(max_zoom, current_zoom)
  41. set_zoom(Vector2(current_zoom, current_zoom))
  42. update_sound_players()
  43. fix_borders()
  44. if Input.is_action_just_released("zoom_out"):
  45. current_zoom *= (1 - delta * ZOOM_SPEED)
  46. current_zoom = max(min_zoom, current_zoom)
  47. set_zoom(Vector2(current_zoom, current_zoom))
  48. update_sound_players()
  49. fix_borders()
  50. var new_position = get_screen_center_position()
  51. if previous_position != new_position:
  52. emit_signal("camera_moved")
  53. previous_position = get_screen_center_position()
  54. func update_sound_players():
  55. var players = get_tree().get_nodes_in_group("sound_player")
  56. var dist = Vector2(DisplayServer.window_get_size()) / zoom
  57. for sound_player in players:
  58. sound_player.set_max_distance(dist.x)
  59. func update_zoom_values():
  60. var oversize = DisplayServer.window_get_size().x / 1920.0
  61. if oversize > 1.0:
  62. min_zoom = BASE_MIN_ZOOM * oversize
  63. if current_zoom < min_zoom:
  64. current_zoom = min_zoom
  65. set_zoom(Vector2(current_zoom, current_zoom))
  66. else:
  67. min_zoom = BASE_MIN_ZOOM
  68. # Fix the camera lock being 🌠🌠 fucking stupid 🌠🌠
  69. func fix_borders():
  70. var pos = get_position()
  71. var rect = Vector2(DisplayServer.window_get_size()) / zoom
  72. pos.x = max(pos.x, limit_left + rect.x / 2.0)
  73. pos.x = min(pos.x, limit_right - rect.x / 2.0)
  74. pos.y = max(pos.y, limit_top + rect.y / 2.0)
  75. pos.y = min(pos.y, limit_bottom - rect.y / 2.0)
  76. set_position(pos)