Virtual-Joystick-Godot icon indicating copy to clipboard operation
Virtual-Joystick-Godot copied to clipboard

Only 8 directions when using input actions

Open PinkSerenity opened this issue 5 months ago • 4 comments

When using input actions, using Input.get_vector() (which apparently got fixed) as well as Input.get_axis() results in vectors that are 8-directional. I updated the following methods to fix it:

func _update_joystick(touch_position: Vector2) -> void:
	var _base_radius = _get_base_radius()
	var center : Vector2 = _base.global_position + _base_radius
	var vector : Vector2 = touch_position - center
	vector = vector.limit_length(clampzone_size)
	
	if joystick_mode == Joystick_mode.FOLLOWING and touch_position.distance_to(center) > clampzone_size:
		_move_base(touch_position - vector)
	
	_move_tip(center + vector)
	
	if vector.length_squared() > deadzone_size * deadzone_size:
		is_pressed = true
		output = (vector - (vector.normalized() * deadzone_size)) / (clampzone_size - deadzone_size)

		if use_input_actions:
			if output.x > 0:
				Input.action_press(action_right, output.x)
				Input.action_release(action_left)
			else:
				Input.action_press(action_left, -output.x)
				Input.action_release(action_right)

			if output.y > 0:
				Input.action_press(action_down, output.y)
				Input.action_release(action_up)
			else:
				Input.action_press(action_up, -output.y)
				Input.action_release(action_down)

	else:
		is_pressed = false
		output = Vector2.ZERO
		if use_input_actions:
			_reset_input()

func _reset():
	is_pressed = false
	output = Vector2.ZERO
	_touch_index = -1
	_tip.modulate = _default_color
	_base.position = _base_default_position
	_tip.position = _tip_default_position
	if use_input_actions:
		_reset_input()

func _reset_input():
	for action in [action_left, action_right, action_down, action_up]:
		Input.action_release(action)

PinkSerenity avatar Jan 23 '24 10:01 PinkSerenity