update cursor detection

This commit is contained in:
Lucas Peter 2024-07-26 16:23:27 +02:00
parent fa1870bb3c
commit 454c15f146
No known key found for this signature in database

View file

@ -12,10 +12,14 @@ script/source = "extends Node2D
const Speed:float = 900
var spaceState
var query
var query : PhysicsPointQueryParameters2D
var CastResult
var old_result
var selectedSticker
var hoveredObjects : Array
var hoveredObject
var hoveredSticker
var grabbedSticker
enum CURSOR_STATE {DEFAULT, CLICK, GRAB, GRABBED}
var currentCursorState:CURSOR_STATE
var oldCursorState:CURSOR_STATE
@ -61,34 +65,54 @@ func pointcast():
query.collide_with_areas = true
query.position = get_global_mouse_position()
CastResult = spaceState.direct_space_state.intersect_point(query)
if ( (CastResult.size() > 0) and (old_result != CastResult) ):
old_result = CastResult
#if (CastResult.size()> 2):
#breakpoint # should not detect multiple areas
for _result in CastResult:
if (_result.collider.input_pickable == true):
selectedSticker = _result.collider.get_parent()
if (isSticker(selectedSticker)):
print(\"selected sticker %\",selectedSticker)
else:
selectedSticker = null
if (CastResult.size() == 0 ):
# CastResult is not reliable. Objects are added randomly in the array
# so we need to filter/sort the trace result
if ( CastResult.size() > 0):
hoveredObjects.clear()
for _object in CastResult:
if(_object.collider.input_pickable == true):
hoveredObjects.append(_object.collider.get_parent())
if (hoveredObjects.size() > 0):
if (hoveredObjects.size() >= 2):
sortByPosY(hoveredObjects,false)
hoveredObject = hoveredObjects[0]
print(\"Current hovered object :\", hoveredObject)
if (CastResult.size() == 0 and !grabbedSticker ):
CastResult.clear()
old_result = null
selectedSticker = null
hoveredSticker = null
hoveredObjects.clear()
hoveredObject = 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
func cursor_look():
if (Input.is_action_pressed(\"select\")):
if (selectedSticker):
if (hoveredSticker):
currentCursorState = CURSOR_STATE.GRABBED
if ($GrabTimer.is_stopped()):
$GrabTimer.start()
else:
currentCursorState = CURSOR_STATE.CLICK
else:
if (selectedSticker):
if (hoveredSticker):
currentCursorState = CURSOR_STATE.GRAB
else:
currentCursorState = CURSOR_STATE.DEFAULT
$GrabTimer.stop()
if (currentCursorState != oldCursorState):
oldCursorState = currentCursorState
@ -101,6 +125,11 @@ func cursor_look():
$AnimatedSprite2D.play(\"grab_intro\")
CURSOR_STATE.GRABBED:
$AnimatedSprite2D.play(\"grab\")
func _on_grab_timer_timeout():
if (hoveredSticker):
grabbedSticker = hoveredSticker
"
[sub_resource type="SpriteFrames" id="SpriteFrames_u3xkr"]
@ -158,3 +187,8 @@ frame = 2
frame_progress = 1.0
centered = false
offset = Vector2(-80, -190)
[node name="GrabTimer" type="Timer" parent="."]
wait_time = 0.5
[connection signal="timeout" from="GrabTimer" to="." method="_on_grab_timer_timeout"]