extends Node2D var positions_history : Array var loop_stack : Array signal started_drawing(pos:Vector2) signal stopped_drawing var is_drawing = false func _ready() -> void: init_history_stack() loop_stack = [] Input.mouse_mode = Input.MOUSE_MODE_CAPTURED global_position = get_viewport_rect().size / 2 func _process(delta: float) -> void: if global_position.y < 32: $IconNormal.scale.y = -1.0 else: $IconNormal.scale.y = 1.0 if global_position.x > get_viewport_rect().size.x - 32: $IconNormal.scale.x = -1.0 else: $IconNormal.scale.x = 1.0 func _input(event: InputEvent) -> void: if event is InputEventMouseMotion: var direction = event.relative.normalized() # truthfully should calibrate by mouse # need a max speed for fair gameplay # var speed = clamp(event.relative.length(), 0.0, 128.0) var speed = event.relative.length() global_position += direction * speed restrict_cursor() if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): if not is_drawing: emit_signal("started_drawing", global_position) is_drawing = true push_history_stack(global_position) else: if is_close_to_loop(): create_valid_loop() init_history_stack() if is_drawing: emit_signal("stopped_drawing") is_drawing = false func get_tail(max_length: int = 32) -> Array: var tail_length = min(positions_history.size(), max_length) var output = positions_history.slice(positions_history.size() - tail_length, positions_history.size()) return output func is_close_to_loop () -> bool: if positions_history.size() < 4: return false var to = positions_history[positions_history.size() - 1] var from = positions_history[0] var distance = (to - from).length() print(distance) if distance < Globals.SNAP_DISTANCE: print((to - from).length()) return true return false func init_history_stack() -> void: positions_history = [] func create_valid_loop() -> void: var smoothed_loop = positions_history var last = 0 # simplify for j in range(1): var new_loop = [] for i in range(0, smoothed_loop.size(), 2): new_loop.append(smoothed_loop[i]) smoothed_loop = new_loop loop_stack.append(smoothed_loop) func push_history_stack(value : Vector2) -> void: positions_history.append(value) if positions_history.size() > Globals.HISTORY_LENGTH: positions_history.pop_front() func restrict_cursor() -> void: if global_position.x < 0: global_position.x = 0 if global_position.y < 0: global_position.y = 0 if global_position.x > get_viewport_rect().size.x: global_position.x = get_viewport_rect().size.x if global_position.y > get_viewport_rect().size.y: global_position.y = get_viewport_rect().size.y