diff --git a/core/Cursor.gd b/core/Cursor.gd index ddf7add..2584762 100644 --- a/core/Cursor.gd +++ b/core/Cursor.gd @@ -1,14 +1,14 @@ extends Node2D -var spaceState +var spaceState:World2D var query : PhysicsPointQueryParameters2D var CastResult : Array var hoveredObjects : Array -var hoveredObject -var hoveredSticker -var grabbedSticker -var grabbedStickerOffset +var hoveredObject:CollisionObject2D +var hoveredSticker:Area2D +var grabbedSticker:Area2D +var grabbedStickerOffset:Vector2 enum CURSOR_STATE {DEFAULT, CLICK, GRAB, GRABBED} var currentCursorState:CURSOR_STATE = CURSOR_STATE.DEFAULT @@ -30,12 +30,13 @@ func _process(_delta): pointcast() cursor_look() if (grabbedSticker != null): - grabbedSticker.position = grabbedStickerOffset+get_global_mouse_position() + grabbedSticker.get_parent().position = grabbedStickerOffset+get_global_mouse_position() func pointcast(): resetCast() query.collide_with_areas = true + query.collide_with_bodies = false 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 @@ -45,7 +46,7 @@ func pointcast(): #region Fill HoveredObjects for _object in CastResult: if(_object.collider.input_pickable == true): - hoveredObjects.append(_object.collider.get_parent()) + hoveredObjects.append(_object.collider) #Get the object that have the collision #endregion if (hoveredObjects.size() > 0): if (hoveredObjects.size() >= 2): @@ -72,7 +73,7 @@ func resetCast(bFull = false): CastResult.clear() hoveredObjects.clear() if bFull: - if (hoveredObject != null and hoveredObject.has_method("on_unhover")): + if (hoveredObject != null and hoveredObject.has_method("on_unhover") and (hoveredObject != grabbedSticker)): hoveredObject.on_unhover() hoveredObject = null hoveredSticker = null @@ -89,7 +90,7 @@ func sortByPosY(objects: Array, ascending_order: bool = true): func comparePosY(a, b): #print("Compare ",a," at ",a.position.y, " and ",b," at ",b.position.y ) - return a.position.y < b.position.y + return a.get_parent().position.y < b.get_parent().position.y #Sticker are always at 0, so we need parent position func _input(rawInputEvent:InputEvent): @@ -106,8 +107,8 @@ func grab_start(): grabbedSticker = hoveredSticker print("Grabbed ", grabbedSticker) - grabbedStickerOffset = grabbedSticker.position - get_global_mouse_position() - print("offset =", grabbedStickerOffset, " Stickpos:",grabbedSticker.position,"-",get_global_mouse_position() ) + grabbedStickerOffset = grabbedSticker.get_parent().position - get_global_mouse_position() + print("offset =", grabbedStickerOffset, " Stickpos:",grabbedSticker.get_parent().position,"-",get_global_mouse_position() ) if (grabbedSticker.has_method("on_grab")): grabbedSticker.on_grab(grabbedStickerOffset) @@ -117,7 +118,6 @@ func grab_end(): print("stopg grabbin at ",query.position ) DebugDraw.points.append(query.position) DebugDraw.drawPoints() - #TODO: Drop the sticker or maybe he will auto-drop ? grabbedSticker = null diff --git a/core/Cursor.tscn b/core/Cursor.tscn index fb9df92..48fffc0 100644 --- a/core/Cursor.tscn +++ b/core/Cursor.tscn @@ -61,7 +61,7 @@ centered = false offset = Vector2(-80, -190) [node name="GrabTimer" type="Timer" parent="."] -wait_time = 0.5 +wait_time = 0.3 one_shot = true [connection signal="animation_changed" from="AnimatedSprite2D" to="." method="_on_animated_sprite_2d_animation_changed"] diff --git a/core/Sticker.gd b/core/Sticker.gd index 28be263..5af9d00 100644 --- a/core/Sticker.gd +++ b/core/Sticker.gd @@ -1,23 +1,106 @@ -extends Node +@tool +extends Area2D +#TODO: I need to remake stickers by exporting node directly instead of customizing all the thing in export tab. + +@export_group("Sticker Detection Shape") +@export var Shape :Shape2D: + set(new_shape): + Shape = new_shape + $StickerDetectionShape.shape = Shape + $StickerDetectionShape.queue_redraw() +@export var Position :Vector2: + set(new_position): + Position = new_position + $StickerDetectionShape.position = Position + $StickerDetectionShape.queue_redraw() +@export var Rotation :float: + set(new_rotation): + Rotation = new_rotation + $StickerDetectionShape.rotation = Rotation + $StickerDetectionShape.queue_redraw() + +@export_group("Sticker Sprites") +@export var WorldSprite:Texture2D: + set(new_texture): + WorldSprite = new_texture + $StickerSprite.texture = WorldSprite + $StickerSprite.queue_redraw() +@export var StickerSprite:Texture2D +@export var Offset:Vector2: + set(new_offset): + Offset = new_offset + $StickerSprite.offset = Offset + $StickerSprite.queue_redraw() +@export var FlipH:bool: + set(flip): + FlipH = flip + $StickerSprite.flip_h = FlipH + $StickerSprite.queue_redraw() +@export var OutlineMat:ShaderMaterial = preload("res://shaders/shaderMaterial_Outline.tres") +@export var PreviewSticker:bool: + set(set_preview): + PreviewSticker = set_preview + if (PreviewSticker): + $StickerSprite.texture = StickerSprite + else: + $StickerSprite.texture = WorldSprite + $StickerSprite.queue_redraw() +@export var Foiled:bool #TODO: Foil material and logic -# Called when the node enters the scene tree for the first time. func _ready(): - pass # Replace with function body. + if (position != Vector2(0,0)): + position == Vector2(0,0) + printerr(self," should not have transform, resetting") + if (get_parent() == get_tree().root): + printerr("stickers should always have a parent") + breakpoint + + +func on_released(): + print(self," released") + get_parent().top_level = false + get_parent().reparent(MapManager.current_scene.get_child(0)) + for _childNode in get_parent().get_children(): + _childNode.set_deferred("disabled",false) + if(_childNode != self): + _childNode.visible = true + + +func on_click(): + print(self," clicked") + +func on_hover(): + if (StickerSprite != null): + $StickerSprite.texture = StickerSprite + else: + $StickerSprite.texture = WorldSprite + $StickerSprite.material = OutlineMat + queue_redraw() + +func on_unhover(): + $StickerSprite.texture = WorldSprite + $StickerSprite.material = null + queue_redraw() + +func on_grab(_offset:Vector2=Vector2(0.0,0.0)): + get_parent().top_level = true + get_parent().reparent(get_tree().root) + for _childNode in get_parent().get_children(): + _childNode.set_deferred("disabled",true) + if(_childNode != self): + _childNode.visible = false -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass +#func _on_tree_entered(): + #if(ParentSprite != null): + #var StickerTag:Array + #StickerTag.append("sticker") + #Global.add_tags(ParentSprite,StickerTag) -func _on_area_2d_mouse_entered(): - pass # Replace with function body. - - -func _on_area_2d_mouse_exited(): - pass # Replace with function body. - - -func _on_tree_entered(): - pass # Replace with function body. +#func _on_tree_exited(): + #if(ParentSprite != null): + #var StickerTag:Array + #StickerTag.append("sticker") + #Global.remove_tags(ParentSprite,StickerTag) diff --git a/core/Sticker.tscn b/core/Sticker.tscn deleted file mode 100644 index 659b22d..0000000 --- a/core/Sticker.tscn +++ /dev/null @@ -1,30 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://kbso0l2uk2n7"] - -[sub_resource type="GDScript" id="GDScript_4kxk0"] -script/source = "extends Area2D - - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass - - -func _on_mouse_entered(): - pass # Replace with function body. - - -func _on_mouse_exited(): - pass # Replace with function body. -" - -[node name="StickerDetection" type="Area2D"] -monitoring = false -script = SubResource("GDScript_4kxk0") - -[connection signal="mouse_entered" from="." to="." method="_on_mouse_entered"] -[connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"] diff --git a/core/StickerArea.tscn b/core/StickerArea.tscn new file mode 100644 index 0000000..c00a3d9 --- /dev/null +++ b/core/StickerArea.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=2 format=3 uid="uid://kbso0l2uk2n7"] + +[ext_resource type="Script" path="res://core/Sticker.gd" id="1_7yoct"] + +[node name="Sticker" type="Area2D"] +collision_layer = 2 +collision_mask = 255 +monitoring = false +script = ExtResource("1_7yoct") +metadata/tags = PackedStringArray("sticker") + +[node name="StickerDetectionShape" type="CollisionShape2D" parent="."] + +[node name="StickerSprite" type="Sprite2D" parent="."] + +[connection signal="mouse_entered" from="." to="." method="_on_mouse_entered"] +[connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"] +[connection signal="tree_entered" from="." to="." method="_on_tree_entered"] +[connection signal="tree_exited" from="." to="." method="_on_tree_exited"] diff --git a/core/global.gd b/core/global.gd index 97fcea5..ed72a6d 100644 --- a/core/global.gd +++ b/core/global.gd @@ -11,7 +11,7 @@ func _process(_delta): pass func get_tags(selectedObject:Node): - var _tags: Array + var _tags: PackedStringArray if (selectedObject.has_meta("tags")): _tags = selectedObject.get_meta("tags") return _tags @@ -19,19 +19,21 @@ func get_tags(selectedObject:Node): printerr("no tags inside %",selectedObject) return _tags -func add_tags(selectedObject:Node,tags:Array): - var _all_tags:Array +func add_tags(selectedObject:Node,tags:PackedStringArray): + var _all_tags:PackedStringArray if (selectedObject.has_meta("tags")): _all_tags = selectedObject.get_meta("tags") - _all_tags.append(tags) + _all_tags.append_array(tags) selectedObject.set_meta("tags",_all_tags) -func remove_tags(selectedObject:Node,tags:Array): +func remove_tags(selectedObject:Node,tags:PackedStringArray): if (selectedObject.has_meta("tags")): - var _all_tags:Array + var _all_tags:PackedStringArray _all_tags = selectedObject.get_meta("tags") - for _tag in tags: - _all_tags.erase(_tag) + for _tag:String in tags: + if(_all_tags.find(_tag) !=-1): + _all_tags.remove_at(_all_tags.find(_tag)) + selectedObject.set_meta("tags",_all_tags) func isSticker(selectedObject:Node): var _isSticker:bool = false diff --git a/prefab/free_sticker.tscn b/prefab/free_sticker.tscn index a072aa3..b933079 100644 --- a/prefab/free_sticker.tscn +++ b/prefab/free_sticker.tscn @@ -1,68 +1,17 @@ -[gd_scene load_steps=4 format=3 uid="uid://domcpxdf6lqpb"] +[gd_scene load_steps=3 format=3 uid="uid://domcpxdf6lqpb"] -[ext_resource type="Texture2D" uid="uid://cun14l52f477p" path="res://textures/atlas/Bushes_All_01_SPRT.png" id="1_1wk1p"] +[ext_resource type="PackedScene" uid="uid://kbso0l2uk2n7" path="res://core/StickerArea.tscn" id="2_84v7t"] [sub_resource type="AtlasTexture" id="AtlasTexture_2wdar"] -atlas = ExtResource("1_1wk1p") region = Rect2(384, 64, 288, 224) -[sub_resource type="GDScript" id="GDScript_uqtu8"] -script/source = "@tool -extends Sprite2D - -var OutlineMat:ShaderMaterial = preload(\"res://shaders/shaderMaterial_Outline.tres\") - -@export_group(\"Sticker Detection Shape\") -@export var Shape :Shape2D: - set(new_shape): - Shape = new_shape - $Area2D/CollisionShape2D.shape = Shape - $Area2D/CollisionShape2D.queue_redraw() -@export var Position :Vector2: - set(new_position): - Position = new_position - $Area2D/CollisionShape2D.position = Position - $Area2D/CollisionShape2D.queue_redraw() -@export var Rotation :float: - set(new_rotation): - Rotation = new_rotation - $Area2D/CollisionShape2D.rotation = Rotation - $Area2D/CollisionShape2D.queue_redraw() - - -func on_released(): - print(self,\" released\") - -func on_click(): - print(self,\" clicked\") - -func on_hover(): - material = OutlineMat - queue_redraw() - -func on_unhover(): - material = null - queue_redraw() - -func on_grab(_offset:Vector2=Vector2(0.0,0.0)): - pass -" - [node name="FreeSticker1" type="Sprite2D"] scale = Vector2(3.80334, 3.95089) texture = SubResource("AtlasTexture_2wdar") centered = false offset = Vector2(-161.055, -179.785) -script = SubResource("GDScript_uqtu8") metadata/tags = ["sticker"] -[node name="Area2D" type="Area2D" parent="."] -collision_layer = 2 -collision_mask = 0 -monitoring = false - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] -position = Vector2(-4.46976, -71.6294) -rotation = 1.5708 +[node name="StickerDetection" parent="." instance=ExtResource("2_84v7t")] [connection signal="property_list_changed" from="." to="." method="_on_property_list_changed"]