Removing superfluous code, updating camera a bit

This commit is contained in:
Dan 2024-06-06 10:55:48 +01:00
parent cec9227b67
commit fc896925d6
7 changed files with 157 additions and 119 deletions

View file

@ -1,106 +1,31 @@
extends Camera2D
extends Node2D
class_name FreeCameraComponent
@export var key : bool = true
@export var drag : bool = true
@export var edge : bool = false
@export var wheel : bool = true
@export var zoom_in_limit : float = 2.5 # The max vector2 zoom value
@export var camera_speed : int = 450 # Camera speed in px/s
@export var camera_margin : int = 50 # Pixels around edge of screen where the mouse will start moving the camera
# Initial zoom value taken from Editor.
var camera_zoom : Vector2 = zoom
const camera_zoom_speed = Vector2(0.5, 0.5)
var camera_movement : Vector2 = Vector2.ZERO
var _prev_mouse_pos : Vector2 = Vector2.ZERO
# INPUTS
# Right mouse button was or is pressed.
var __rmbk : bool = false
# Move camera by keys: left, top, right, bottom.
var __keys : Array[bool] = [false, false, false, false]
@onready var camera : GameCamera = $GameCamera
@export var tile_map : TileMap = null
func _ready() -> void:
set_drag_horizontal_enabled(false)
set_drag_vertical_enabled(false)
set_position_smoothing_enabled(true)
set_position_smoothing_speed(4)
func _physics_process(delta : float) -> void:
# Move camera by keys defined in InputMap (ui_left/top/right/bottom).
if key:
if __keys[0]:
camera_movement.x -= camera_speed * delta
if __keys[1]:
camera_movement.y -= camera_speed * delta
if __keys[2]:
camera_movement.x += camera_speed * delta
if __keys[3]:
camera_movement.y += camera_speed * delta
# Move camera by mouse, when it's on the margin (defined by camera_margin).
if edge:
var rec : Rect2 = get_viewport().get_visible_rect()
var v : Vector2 = get_local_mouse_position() + rec.size/2
if rec.size.x - v.x <= camera_margin:
camera_movement.x += camera_speed * delta
if v.x <= camera_margin:
camera_movement.x -= camera_speed * delta
if rec.size.y - v.y <= camera_margin:
camera_movement.y += camera_speed * delta
if v.y <= camera_margin:
camera_movement.y -= camera_speed * delta
# When RMB is pressed, move camera by difference of mouse position
if drag and __rmbk:
camera_movement = _prev_mouse_pos - get_local_mouse_position()
# Update position of the camera.
position += camera_movement * get_zoom()
# Set camera movement to zero, update old mouse position.
camera_movement = Vector2(0,0)
_prev_mouse_pos = get_local_mouse_position()
if !tile_map:
Log.err("FreeCameraComponent: tile_map is not set")
func _unhandled_input( event : InputEvent) ->void:
if event is InputEventMouseButton:
var mouse_event : InputEventMouseButton = event as InputEventMouseButton
if drag and\
mouse_event.button_index == MOUSE_BUTTON_RIGHT:
# Control by right mouse button.
if mouse_event.pressed: __rmbk = true
else: __rmbk = false
# Check if mouse wheel was used. Not handled by InputMap!
if wheel:
if mouse_event.button_index == MOUSE_BUTTON_WHEEL_DOWN and\
camera_zoom.x - camera_zoom_speed.x > 0 and\
camera_zoom.y - camera_zoom_speed.y > 0:
camera_zoom -= camera_zoom_speed
set_zoom(camera_zoom)
if mouse_event.button_index == MOUSE_BUTTON_WHEEL_UP and\
camera_zoom.x + camera_zoom_speed.x < zoom_in_limit and\
camera_zoom.y + camera_zoom_speed.y < zoom_in_limit:
camera_zoom += camera_zoom_speed
set_zoom(camera_zoom)
# Control by keyboard handled by InpuMap.
if event.is_action_pressed("ui_left"):
__keys[0] = true
if event.is_action_pressed("ui_up"):
__keys[1] = true
if event.is_action_pressed("ui_right"):
__keys[2] = true
if event.is_action_pressed("ui_down"):
__keys[3] = true
if event.is_action_released("ui_left"):
__keys[0] = false
if event.is_action_released("ui_up"):
__keys[1] = false
if event.is_action_released("ui_right"):
__keys[2] = false
if event.is_action_released("ui_down"):
__keys[3] = false
## Set the limits for the camera based on the tilemap
#camera.set_limits(0, tile_map.)
# Stop the camera scrolling out of bounds of the map
var tile_size : Vector2i = tile_map.get_tileset().tile_size
var tilemap_size : Vector2i = tile_map.get_used_rect().end - tile_map.get_used_rect().position
var map_size_x : int = tile_size.x * tilemap_size.x
var map_size_y : int = tile_size.y * tilemap_size.y
Log.pr("Size Y", map_size_y, get_viewport().size.y)
Log.pr("Size X", map_size_x, get_viewport().size.x)
#Log.pr(map_size - get_viewport().size.x)
camera.set_limit(SIDE_LEFT, 0)
camera.set_limit(SIDE_TOP, 0)
camera.set_limit(SIDE_RIGHT, map_size_x)
camera.set_limit(SIDE_BOTTOM, map_size_y)
pass