2024-07-26 21:13:59 +00:00
|
|
|
extends Node2D
|
|
|
|
|
|
|
|
var spaceState
|
|
|
|
var query : PhysicsPointQueryParameters2D
|
|
|
|
var CastResult : Array
|
|
|
|
|
|
|
|
var hoveredObjects : Array
|
|
|
|
var hoveredObject
|
|
|
|
var hoveredSticker
|
|
|
|
var grabbedSticker
|
2024-07-28 20:49:46 +00:00
|
|
|
var grabbedStickerOffset
|
2024-07-26 21:13:59 +00:00
|
|
|
|
|
|
|
enum CURSOR_STATE {DEFAULT, CLICK, GRAB, GRABBED}
|
|
|
|
var currentCursorState:CURSOR_STATE = CURSOR_STATE.DEFAULT
|
|
|
|
var oldCursorState:CURSOR_STATE = CURSOR_STATE.DEFAULT
|
2024-07-27 14:30:15 +00:00
|
|
|
var cursorPlaying:bool
|
2024-07-26 21:13:59 +00:00
|
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
|
|
func _ready():
|
|
|
|
if not OS.is_debug_build():
|
|
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_CONFINED_HIDDEN)
|
|
|
|
query = PhysicsPointQueryParameters2D.new()
|
|
|
|
spaceState = get_world_2d()
|
|
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
|
|
func _process(_delta):
|
|
|
|
#region Cursor Position
|
|
|
|
position = get_global_mouse_position()
|
|
|
|
#endregion
|
|
|
|
pointcast()
|
|
|
|
cursor_look()
|
2024-07-29 13:24:09 +00:00
|
|
|
if (grabbedSticker != null):
|
2024-07-28 20:49:46 +00:00
|
|
|
grabbedSticker.position = grabbedStickerOffset+get_global_mouse_position()
|
2024-07-26 21:13:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
func isSticker(selectedObject:Node):
|
|
|
|
var _isSticker:bool = false
|
2024-07-29 13:24:09 +00:00
|
|
|
var _tags = Global.getTags(selectedObject)
|
2024-07-26 21:13:59 +00:00
|
|
|
if (_tags.size() > 0):
|
|
|
|
if (_tags.find("sticker") != -1):
|
|
|
|
_isSticker = true
|
|
|
|
|
|
|
|
return _isSticker
|
|
|
|
|
|
|
|
func pointcast():
|
|
|
|
resetCast()
|
|
|
|
query.collide_with_areas = true
|
|
|
|
query.position = get_global_mouse_position()
|
|
|
|
CastResult = spaceState.direct_space_state.intersect_point(query)
|
|
|
|
# CastResult is not reliable. Objects are added randomly in the array
|
|
|
|
# so we need to filter/sort the trace result
|
|
|
|
if ( CastResult.size() > 0 and (grabbedSticker == null)):
|
2024-07-27 14:30:15 +00:00
|
|
|
|
2024-07-26 21:13:59 +00:00
|
|
|
#region Fill HoveredObjects
|
|
|
|
for _object in CastResult:
|
|
|
|
if(_object.collider.input_pickable == true):
|
|
|
|
hoveredObjects.append(_object.collider.get_parent())
|
|
|
|
#endregion
|
|
|
|
if (hoveredObjects.size() > 0):
|
|
|
|
if (hoveredObjects.size() >= 2):
|
|
|
|
sortByPosY(hoveredObjects,false)
|
|
|
|
if (hoveredObjects[0] != hoveredObject):
|
2024-07-29 12:04:10 +00:00
|
|
|
$GrabTimer.stop()
|
2024-07-28 12:04:58 +00:00
|
|
|
if (hoveredObject and hoveredObject.has_method("on_unhover")):
|
|
|
|
hoveredObject.on_unhover()
|
2024-07-26 21:13:59 +00:00
|
|
|
hoveredObject = hoveredObjects[0]
|
2024-07-28 12:04:58 +00:00
|
|
|
if (hoveredObject and hoveredObject.has_method("on_hover")):
|
|
|
|
hoveredObject.on_hover()
|
2024-07-26 21:13:59 +00:00
|
|
|
print("Current hovered object :", hoveredObject)
|
|
|
|
if (isSticker(hoveredObject)):
|
|
|
|
hoveredSticker = hoveredObject
|
|
|
|
print("Current hovered sticker :", hoveredSticker)
|
|
|
|
else:
|
|
|
|
hoveredSticker = null
|
|
|
|
else:
|
|
|
|
resetCast(true)
|
|
|
|
else:
|
|
|
|
resetCast(true)
|
|
|
|
|
|
|
|
func resetCast(bFull = false):
|
|
|
|
CastResult.clear()
|
|
|
|
hoveredObjects.clear()
|
|
|
|
if bFull:
|
2024-07-27 15:04:27 +00:00
|
|
|
if (hoveredObject and hoveredObject.has_method("on_unhover")):
|
|
|
|
hoveredObject.on_unhover()
|
2024-07-26 21:13:59 +00:00
|
|
|
hoveredObject = null
|
|
|
|
hoveredSticker = null
|
|
|
|
|
|
|
|
func sortByPosY(objects: Array, ascending_order: bool = true):
|
|
|
|
var _tempArray :Array
|
|
|
|
_tempArray = objects
|
|
|
|
# Inline comparison function
|
|
|
|
_tempArray.sort_custom(comparePosY)
|
|
|
|
# Reverse if descending order is required
|
|
|
|
if not ascending_order:
|
|
|
|
_tempArray.reverse()
|
|
|
|
objects = _tempArray
|
|
|
|
|
|
|
|
func comparePosY(a, b):
|
|
|
|
#print("Compare ",a," at ",a.position.y, " and ",b," at ",b.position.y )
|
|
|
|
return a.position.y < b.position.y
|
|
|
|
|
|
|
|
|
2024-07-27 14:30:15 +00:00
|
|
|
func _input(rawInputEvent:InputEvent):
|
|
|
|
if (rawInputEvent.is_action_pressed("select")):
|
|
|
|
cursorClick()
|
|
|
|
$GrabTimer.start()
|
|
|
|
if (rawInputEvent.is_action_released("select")):
|
2024-07-26 21:13:59 +00:00
|
|
|
$GrabTimer.stop()
|
2024-07-29 13:24:09 +00:00
|
|
|
if (grabbedSticker != null):
|
2024-07-27 14:30:15 +00:00
|
|
|
grab_end()
|
|
|
|
|
2024-07-27 15:04:27 +00:00
|
|
|
func grab_start():
|
2024-07-28 20:49:46 +00:00
|
|
|
if (hoveredSticker and grabbedSticker == null):
|
2024-07-27 15:04:27 +00:00
|
|
|
grabbedSticker = hoveredSticker
|
2024-07-28 20:49:46 +00:00
|
|
|
|
2024-07-27 15:04:27 +00:00
|
|
|
print("Grabbed ", grabbedSticker)
|
2024-07-28 20:49:46 +00:00
|
|
|
grabbedStickerOffset = grabbedSticker.position - get_global_mouse_position()
|
|
|
|
print("offset =", grabbedStickerOffset, " Stickpos:",grabbedSticker.position,"-",get_global_mouse_position() )
|
|
|
|
if (grabbedSticker.has_method("on_grab")):
|
|
|
|
grabbedSticker.on_grab(grabbedStickerOffset)
|
|
|
|
|
2024-07-27 14:30:15 +00:00
|
|
|
func grab_end():
|
|
|
|
grabbedSticker.on_released()
|
2024-07-27 15:04:27 +00:00
|
|
|
|
2024-07-27 14:30:15 +00:00
|
|
|
print("stopg grabbin at ",query.position )
|
|
|
|
DebugDraw.points.append(query.position)
|
|
|
|
DebugDraw.drawPoints()
|
2024-07-27 15:04:27 +00:00
|
|
|
#TODO: Drop the sticker or maybe he will auto-drop ?
|
|
|
|
|
|
|
|
grabbedSticker = null
|
2024-07-26 21:13:59 +00:00
|
|
|
|
2024-07-27 14:30:15 +00:00
|
|
|
func cursorClick():
|
|
|
|
if (hoveredObject and hoveredObject.has_method("on_click")):
|
2024-07-29 12:04:10 +00:00
|
|
|
hoveredObject.on_click()
|
2024-07-27 14:30:15 +00:00
|
|
|
|
|
|
|
func cursor_look():
|
2024-07-28 12:15:04 +00:00
|
|
|
if (grabbedSticker ):
|
|
|
|
currentCursorState = CURSOR_STATE.GRABBED
|
|
|
|
elif (hoveredSticker):
|
2024-07-29 13:24:09 +00:00
|
|
|
if ($GrabTimer and !($GrabTimer.is_stopped())):
|
2024-07-28 12:15:04 +00:00
|
|
|
currentCursorState = CURSOR_STATE.GRABBED
|
|
|
|
else:
|
|
|
|
currentCursorState = CURSOR_STATE.GRAB
|
2024-07-29 13:24:09 +00:00
|
|
|
elif ($GrabTimer and !($GrabTimer.is_stopped())):
|
2024-07-28 12:15:04 +00:00
|
|
|
currentCursorState = CURSOR_STATE.CLICK
|
|
|
|
else:
|
|
|
|
currentCursorState = CURSOR_STATE.DEFAULT
|
2024-07-27 14:30:15 +00:00
|
|
|
|
2024-07-26 21:13:59 +00:00
|
|
|
if (currentCursorState != oldCursorState):
|
|
|
|
oldCursorState = currentCursorState
|
|
|
|
match oldCursorState:
|
|
|
|
CURSOR_STATE.DEFAULT:
|
|
|
|
$AnimatedSprite2D.play("default")
|
|
|
|
CURSOR_STATE.CLICK:
|
|
|
|
$AnimatedSprite2D.play("click")
|
|
|
|
CURSOR_STATE.GRAB:
|
|
|
|
$AnimatedSprite2D.play("grab_intro")
|
|
|
|
CURSOR_STATE.GRABBED:
|
|
|
|
$AnimatedSprite2D.play("grab")
|
|
|
|
|
|
|
|
|
|
|
|
func _on_grab_timer_timeout():
|
2024-07-27 15:04:27 +00:00
|
|
|
grab_start()
|
2024-07-27 14:30:15 +00:00
|
|
|
|
|
|
|
|
|
|
|
func _on_animated_sprite_2d_animation_changed():
|
|
|
|
cursorPlaying = true
|
|
|
|
|
|
|
|
|
|
|
|
func _on_animated_sprite_2d_animation_finished():
|
|
|
|
cursorPlaying = false
|