131 lines
4.0 KiB
GDScript
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()
|