broken_seals_roguelike/game/ui/touch_pad/TurnPanel.gd

116 lines
2.9 KiB
GDScript

extends Node2D
const INACTIVE_IDX = -1;
export (String) var listenerNodePath : String = "../../../../../.."
export (String) var padname : String = ""
var parent : Control
var centerPoint = Vector2(0,0)
var currentForce = Vector2(0,0)
var last_pointer_position : Vector2 = Vector2()
var currentPointerIDX = INACTIVE_IDX;
var listener : Node = null
func _ready():
parent = get_node("..")
listener = get_node(listenerNodePath)
if listener != null:
if not listener.has_method("queue_camera_rotation"):
listener = null
set_process_input(true)
func get_force():
return currentForce
func _input(event):
var incomingPointer = extractPointerIdx(event)
if incomingPointer == INACTIVE_IDX:
return
if need2ChangeActivePointer(event):
if (currentPointerIDX != incomingPointer) and event.is_pressed():
currentPointerIDX = incomingPointer;
last_pointer_position = Vector2(event.position.x - parent.get_global_rect().position.x, event.position.y - parent.get_global_rect().position.y);
get_tree().set_input_as_handled()
var theSamePointer = currentPointerIDX == incomingPointer
if isActive() and theSamePointer:
process_input(event)
func need2ChangeActivePointer(event): #touch down inside analog
if event is InputEventMouseButton or event is InputEventScreenTouch:
return parent.get_global_rect().has_point(Vector2(event.position.x, event.position.y))
else:
return false
func isActive():
return currentPointerIDX != INACTIVE_IDX
func extractPointerIdx(event):
var touch = event is InputEventScreenTouch
var drag = event is InputEventScreenDrag
var mouseButton = event is InputEventMouseButton
var mouseMove = event is InputEventMouseMotion
#print(event)
if touch:
return event.index
elif drag:
return event.index
elif mouseButton or mouseMove:
#plog("SOMETHING IS VERYWRONG??, I HAVE MOUSE ON TOUCH DEVICE")
return INACTIVE_IDX
else:
return INACTIVE_IDX
func process_input(event):
calculateForce(event.position.x - parent.get_global_rect().position.x, event.position.y - parent.get_global_rect().position.y)
var isReleased = isReleased(event)
if isReleased:
reset()
get_tree().set_input_as_handled()
func reset():
currentPointerIDX = INACTIVE_IDX
##calculateForce(0, 0)
last_pointer_position = Vector2()
func calculateForce(var x, var y):
var v : Vector2 = Vector2(x, y)
currentForce = last_pointer_position - v
last_pointer_position = v
sendSignal2Listener()
func sendSignal2Listener():
if (listener != null):
# listener.analog_force_change(currentForce, self)
listener.queue_camera_rotation(currentForce)
func isPressed(event):
if event is InputEventMouseMotion:
return (InputEventMouse.button_mask == 1)
elif event is InputEventScreenTouch:
return event.is_pressed()
func isReleased(event):
if event is InputEventScreenTouch:
return !event.is_pressed()
elif event is InputEventMouseButton:
return !event.is_pressed()