rework sticker

Now sticker works by being placed under any Node2D that serve as root/transform. Sticker node handle the visual aspect of the sticker.
This should be changed soon (view TODO)
This commit is contained in:
Lucas Peter 2024-07-30 18:09:44 +02:00
parent 4e658d2ff1
commit f54aa28f8e
No known key found for this signature in database
7 changed files with 144 additions and 121 deletions

View file

@ -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

View file

@ -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"]

View file

@ -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)

View file

@ -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"]

19
core/StickerArea.tscn Normal file
View file

@ -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"]

View file

@ -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

View file

@ -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"]