time-is-odd/Client/Camera2D.gd

131 lines
4.0 KiB
GDScript

extends Camera2D
export var panSpeed = 10.0
export var speed = 20.0
export var zoomspeed = 10.0
# warning-ignore:unused_class_variable
export var zoommargin = 0.1
export var zoomMin = 0.25
export var zoomMax = 3.0
export var marginX = 200.0
export var marginY = 200.0
var mousepos = Vector2()
var mouseposGlobal = Vector2()
var start = Vector2()
var startv = Vector2()
var end = Vector2()
var endv = Vector2()
var zoomfactor = 1.0
var zooming = false
var is_dragging = false
var move_to_point = Vector2()
#onready var rectd = $'../UI/Base/draw_rect'
signal area_selected
signal start_move_selection
func _ready():
# connect("area_selected", get_parent(), "area_selected", [self])
# connect("start_move_selection", get_parent(), "start_move_selection", [self])
pass
func _process(delta):
#smooth movement
var inpx = (int(Input.is_action_pressed("ui_right"))
- int(Input.is_action_pressed("ui_left")))
var inpy = (int(Input.is_action_pressed("ui_down"))
- int(Input.is_action_pressed("ui_up")))
self.position.x = lerp(position.x, position.x + inpx *speed,speed * delta)
self.position.y = lerp(position.y, position.y + inpy *speed,speed * delta)
if Input.is_key_pressed(KEY_CONTROL):
#check mousepos
if mousepos.x < marginX:
position.x = lerp(position.x, position.x - abs(mousepos.x - marginX)/marginX * panSpeed * zoom.x, panSpeed * delta)
elif mousepos.x > OS.window_size.x - marginX:
position.x = lerp(position.x, position.x + abs(mousepos.x - OS.window_size.x + marginX)/marginX * panSpeed * zoom.x, panSpeed * delta)
if mousepos.y < marginY:
position.y = lerp(position.y, position.y - abs(mousepos.y - marginY)/marginY * panSpeed * zoom.y, panSpeed * delta)
elif mousepos.y > OS.window_size.y - marginY:
position.y = lerp(position.y, position.y + abs(mousepos.y - OS.window_size.y + marginY)/marginY * panSpeed * zoom.y, panSpeed * delta)
if Input.is_action_just_pressed("ui_left_mouse_button"):
start = mouseposGlobal
startv = mousepos
is_dragging = true
if is_dragging:
end = mouseposGlobal
endv = mousepos
draw_area()
if Input.is_action_just_released("ui_left_mouse_button"):
if startv.distance_to(mousepos) > 20:
end = mouseposGlobal
endv = mousepos
is_dragging = false
draw_area(false)
emit_signal("area_selected")
else:
end = start
is_dragging = false
draw_area(false)
if Input.is_action_just_released("ui_right_mouse_button"):
move_to_point = mouseposGlobal
emit_signal("start_move_selection")
#zoom in
zoom.x = lerp(zoom.x, zoom.x * zoomfactor, zoomspeed * delta)
zoom.y = lerp(zoom.y, zoom.y * zoomfactor, zoomspeed * delta)
zoom.x = clamp(zoom.x, zoomMin, zoomMax)
zoom.y = clamp(zoom.y, zoomMin, zoomMax)
if not zooming:
zoomfactor = 1.0
# warning-ignore:unused_argument
func draw_area(s = true):
# rectd.rect_size = Vector2(abs(startv.x-endv.x), abs(startv.y - endv.y))
#
## if startv.y <= endv.y and startv.x <= endv.x: # bottom right
## rectd.rect_position = Vector2(startv.x, startv.y - OS.window_size.y)
## elif startv.x >= endv.x and startv.y >= endv.y: # top left
## rectd.rect_position = Vector2(endv.x, endv.y - OS.window_size.y)
## elif startv.x >= endv.x and startv.y <= endv.y: # bottom left
## rectd.rect_position = Vector2(endv.x, startv.y - OS.window_size.y)
## elif startv.x <= endv.x and startv.y >= endv.y: # top right
## rectd.rect_position = Vector2(startv.x, endv.y - OS.window_size.y)
#
# var pos = Vector2()
# pos.x = min(startv.x, endv.x)
# pos.y = min(startv.y, endv.y)
# pos.y -= OS.window_size.y
# rectd.rect_position = pos
#
# rectd.rect_size *= int(s) # true = 1 and false = 0
pass
func _input(event):
if event is InputEventMouseButton:
if event.is_pressed():
zooming = true
if event.button_index == BUTTON_WHEEL_UP:
zoomfactor -= 0.01 * zoomspeed
if event.button_index == BUTTON_WHEEL_DOWN:
zoomfactor += 0.01 * zoomspeed
else:
zooming = false
if event is InputEventMouse:
mousepos = event.position
mouseposGlobal = get_global_mouse_position()