mirror of
https://github.com/Relintai/broken_seals.git
synced 2024-12-25 01:17:10 +01:00
157 lines
3.9 KiB
GDScript3
157 lines
3.9 KiB
GDScript3
|
extends Node2D
|
||
|
|
||
|
# This is by someone else TODO check!
|
||
|
|
||
|
const INACTIVE_IDX = -1;
|
||
|
export var isDynamicallyShowing = false
|
||
|
export (NodePath) var listenerNodePath : NodePath = "/root/game/player"
|
||
|
export var padname = ""
|
||
|
|
||
|
var ball
|
||
|
var bg
|
||
|
var animation_player
|
||
|
var parent
|
||
|
var listenerNode
|
||
|
|
||
|
var centerPoint = Vector2(0,0)
|
||
|
var currentForce = Vector2(0,0)
|
||
|
var halfSize = Vector2()
|
||
|
var ballPos = Vector2()
|
||
|
var squaredHalfSizeLength = 0
|
||
|
var currentPointerIDX = INACTIVE_IDX;
|
||
|
|
||
|
func _ready():
|
||
|
set_process_input(true)
|
||
|
bg = get_node("bg")
|
||
|
ball = get_node("ball")
|
||
|
animation_player = get_node("AnimationPlayer")
|
||
|
parent = get_parent()
|
||
|
halfSize = bg.texture.get_size()/2
|
||
|
squaredHalfSizeLength = halfSize.x * halfSize.y
|
||
|
|
||
|
if (listenerNodePath != "" && listenerNodePath!=null):
|
||
|
listenerNode = get_node(listenerNodePath)
|
||
|
elif listenerNodePath=="":
|
||
|
listenerNode = null
|
||
|
|
||
|
# isDynamicallyShowing = isDynamicallyShowing and parent extends Control
|
||
|
if isDynamicallyShowing:
|
||
|
modulate.a = 0
|
||
|
# hide()
|
||
|
|
||
|
func get_force():
|
||
|
return currentForce
|
||
|
|
||
|
func _unhandled_input(event):
|
||
|
|
||
|
var incomingPointer = extractPointerIdx(event)
|
||
|
#print(incomingPointer)
|
||
|
|
||
|
if incomingPointer == INACTIVE_IDX:
|
||
|
return
|
||
|
|
||
|
if need2ChangeActivePointer(event):
|
||
|
if (currentPointerIDX != incomingPointer) and event.is_pressed():
|
||
|
currentPointerIDX = incomingPointer;
|
||
|
showAtPos(Vector2(event.position.x, event.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:
|
||
|
if isDynamicallyShowing:
|
||
|
#print(get_parent().get_global_rect())
|
||
|
return get_parent().get_global_rect().has_point(Vector2(event.position.x, event.position.y))
|
||
|
else:
|
||
|
var length = (global_position - Vector2(event.position.x, event.position.y)).length_squared();
|
||
|
return length < squaredHalfSizeLength
|
||
|
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 - global_position.x, event.position.y - global_position.y)
|
||
|
updateBallPos()
|
||
|
|
||
|
var isReleased = isReleased(event)
|
||
|
if isReleased:
|
||
|
reset()
|
||
|
|
||
|
get_tree().set_input_as_handled()
|
||
|
|
||
|
|
||
|
func reset():
|
||
|
currentPointerIDX = INACTIVE_IDX
|
||
|
calculateForce(0, 0)
|
||
|
|
||
|
if isDynamicallyShowing:
|
||
|
hide()
|
||
|
else:
|
||
|
updateBallPos()
|
||
|
|
||
|
func showAtPos(pos):
|
||
|
if isDynamicallyShowing:
|
||
|
animation_player.play("alpha_in", 0.2)
|
||
|
global_position = pos
|
||
|
|
||
|
func hide():
|
||
|
animation_player.play("alpha_out", 0.2)
|
||
|
|
||
|
func updateBallPos():
|
||
|
ballPos.x = halfSize.x * currentForce.x #+ halfSize.x
|
||
|
ballPos.y = halfSize.y * -currentForce.y #+ halfSize.y
|
||
|
ball.position = Vector2(ballPos.x, ballPos.y)
|
||
|
|
||
|
func calculateForce(var x, var y):
|
||
|
#get direction
|
||
|
currentForce.x = (x - centerPoint.x)/halfSize.x
|
||
|
currentForce.y = -(y - centerPoint.y)/halfSize.y
|
||
|
#print(currentForce.x, currentForce.y)
|
||
|
#limit
|
||
|
#print(currentForce.length_squared())
|
||
|
if currentForce.length_squared()>1:
|
||
|
currentForce=currentForce/currentForce.length()
|
||
|
|
||
|
sendSignal2Listener()
|
||
|
|
||
|
func sendSignal2Listener():
|
||
|
if (listenerNode != null):
|
||
|
listenerNode.analog_force_change(currentForce, self)
|
||
|
|
||
|
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()
|