diff --git a/core/Cursor.tscn b/core/Cursor.tscn index ac17859..7fcf455 100644 --- a/core/Cursor.tscn +++ b/core/Cursor.tscn @@ -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 @@ -60,35 +64,55 @@ func getTags(selectedObject:Node): 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 = 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): + 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"]