From 0ba4cee5d429b0bb254dbbc76aebbc35134d2831 Mon Sep 17 00:00:00 2001 From: Yan Wittmann Date: Sat, 4 Jan 2025 12:32:22 +0100 Subject: [PATCH] Several camera adjustments --- project/project.godot | 15 +++++++ project/scripts/global/Camera.gd | 62 ++++++++++++++++++++------- project/scripts/global/GameManager.gd | 11 +++++ 3 files changed, 73 insertions(+), 15 deletions(-) diff --git a/project/project.godot b/project/project.godot index 81bc55f..647130e 100644 --- a/project/project.godot +++ b/project/project.godot @@ -56,6 +56,21 @@ camera_drag={ "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":4,"position":Vector2(373, 18),"global_position":Vector2(382, 64),"factor":1.0,"button_index":3,"canceled":false,"pressed":true,"double_click":false,"script":null) ] } +key_1={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":49,"key_label":0,"unicode":49,"location":0,"echo":false,"script":null) +] +} +key_2={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":50,"key_label":0,"unicode":50,"location":0,"echo":false,"script":null) +] +} +key_9={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":57,"key_label":0,"unicode":57,"location":0,"echo":false,"script":null) +] +} [rendering] diff --git a/project/scripts/global/Camera.gd b/project/scripts/global/Camera.gd index c23c760..24865e4 100644 --- a/project/scripts/global/Camera.gd +++ b/project/scripts/global/Camera.gd @@ -8,23 +8,37 @@ extends Camera2D @export var min_position: Vector2 = Vector2(-1000, -1000) @export var max_position: Vector2 = Vector2(4000, 4000) -var target_position: Vector2 var velocity: Vector2 = Vector2.ZERO # var drag_active: bool = false var drag_start: Vector2 +# +const DISABLE_FORCE: Vector2 = Vector2(-1, -1) +# +var force_target_position: Vector2 = DISABLE_FORCE +var force_zoom: Vector2 = DISABLE_FORCE -func _ready(): - target_position = position +func go_to_zooming(position: Vector2, zoom: float) -> void: + force_target_position = position + force_zoom = Vector2(zoom, zoom) + + +func go_to(position: Vector2) -> void: + force_target_position = position + + +func print_config() -> void: + print("camera.go_to_zooming(Vector2(", position.x, ", ", position.y, "), ", zoom, ")") func _input(event): if event is InputEventMouseButton: - if event.button_index == MOUSE_BUTTON_WHEEL_UP: - zoom = zoom * 1.1 - elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN: - zoom = zoom / 1.1 + if force_zoom == DISABLE_FORCE: + if event.button_index == MOUSE_BUTTON_WHEEL_UP: + zoom = zoom * 1.1 + elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN: + zoom = zoom / 1.1 func _process(delta): @@ -39,13 +53,31 @@ func _process(delta): drag_start = drag_end position -= drag_offset / zoom - var is_zoom_in: bool = Input.is_action_pressed("camera_zoom_in") - var is_zoom_out: bool = Input.is_action_pressed("camera_zoom_out") + if force_target_position != DISABLE_FORCE: + # move towards the target position + var offset: Vector2 = force_target_position - position + position += offset * 0.1 + if offset.length() < 1: + force_target_position = DISABLE_FORCE + if force_zoom != DISABLE_FORCE: + # move towards the target zoom + var offset: Vector2 = force_zoom - zoom + zoom += offset * 0.04 + if offset.length() < 0.02: + force_zoom = DISABLE_FORCE + else: + var is_zoom_in: bool = Input.is_action_pressed("camera_zoom_in") + var is_zoom_out: bool = Input.is_action_pressed("camera_zoom_out") - if is_zoom_in: - zoom = zoom * 1.1 - elif is_zoom_out: - zoom = zoom / 1.1 + if is_zoom_in: + zoom = zoom * 1.1 + elif is_zoom_out: + zoom = zoom / 1.1 + + if zoom.length() < 0.2: + zoom = Vector2(1, 1).normalized() * 0.2 + elif zoom.length() > 10: + zoom = Vector2(1, 1).normalized() * 10 var mouse_pos: Vector2 = get_viewport().get_mouse_position() var screen_size: Vector2 = get_viewport().get_visible_rect().size @@ -79,8 +111,8 @@ func _process(delta): if velocity.length() > max_speed: velocity = velocity.normalized() * max_speed - var target_offset = velocity * delta - target_position = position + target_offset + var target_offset = velocity * delta + var target_position = position + target_offset target_position.x = clamp(target_position.x, min_position.x, max_position.x) target_position.y = clamp(target_position.y, min_position.y, max_position.y) diff --git a/project/scripts/global/GameManager.gd b/project/scripts/global/GameManager.gd index 9a839c5..123b128 100644 --- a/project/scripts/global/GameManager.gd +++ b/project/scripts/global/GameManager.gd @@ -4,3 +4,14 @@ extends Node @onready var world: World = $Tileset @onready var player: PlayerManager = $PlayerManager @onready var camera: Camera2D = $Camera2D + +func _ready() -> void: + pass + +func _process(delta: float) -> void: + if Input.is_action_just_pressed("key_1"): + camera.go_to_zooming(Vector2(-100, -50), 1.5) + if Input.is_action_just_pressed("key_2"): + camera.go_to_zooming(Vector2(200, 100), 0.4) + if Input.is_action_just_pressed("key_9"): + camera.print_config()