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:
parent
4e658d2ff1
commit
f54aa28f8e
7 changed files with 144 additions and 121 deletions
|
@ -1,14 +1,14 @@
|
||||||
extends Node2D
|
extends Node2D
|
||||||
|
|
||||||
var spaceState
|
var spaceState:World2D
|
||||||
var query : PhysicsPointQueryParameters2D
|
var query : PhysicsPointQueryParameters2D
|
||||||
var CastResult : Array
|
var CastResult : Array
|
||||||
|
|
||||||
var hoveredObjects : Array
|
var hoveredObjects : Array
|
||||||
var hoveredObject
|
var hoveredObject:CollisionObject2D
|
||||||
var hoveredSticker
|
var hoveredSticker:Area2D
|
||||||
var grabbedSticker
|
var grabbedSticker:Area2D
|
||||||
var grabbedStickerOffset
|
var grabbedStickerOffset:Vector2
|
||||||
|
|
||||||
enum CURSOR_STATE {DEFAULT, CLICK, GRAB, GRABBED}
|
enum CURSOR_STATE {DEFAULT, CLICK, GRAB, GRABBED}
|
||||||
var currentCursorState:CURSOR_STATE = CURSOR_STATE.DEFAULT
|
var currentCursorState:CURSOR_STATE = CURSOR_STATE.DEFAULT
|
||||||
|
@ -30,12 +30,13 @@ func _process(_delta):
|
||||||
pointcast()
|
pointcast()
|
||||||
cursor_look()
|
cursor_look()
|
||||||
if (grabbedSticker != null):
|
if (grabbedSticker != null):
|
||||||
grabbedSticker.position = grabbedStickerOffset+get_global_mouse_position()
|
grabbedSticker.get_parent().position = grabbedStickerOffset+get_global_mouse_position()
|
||||||
|
|
||||||
|
|
||||||
func pointcast():
|
func pointcast():
|
||||||
resetCast()
|
resetCast()
|
||||||
query.collide_with_areas = true
|
query.collide_with_areas = true
|
||||||
|
query.collide_with_bodies = false
|
||||||
query.position = get_global_mouse_position()
|
query.position = get_global_mouse_position()
|
||||||
CastResult = spaceState.direct_space_state.intersect_point(query)
|
CastResult = spaceState.direct_space_state.intersect_point(query)
|
||||||
# CastResult is not reliable. Objects are added randomly in the array
|
# CastResult is not reliable. Objects are added randomly in the array
|
||||||
|
@ -45,7 +46,7 @@ func pointcast():
|
||||||
#region Fill HoveredObjects
|
#region Fill HoveredObjects
|
||||||
for _object in CastResult:
|
for _object in CastResult:
|
||||||
if(_object.collider.input_pickable == true):
|
if(_object.collider.input_pickable == true):
|
||||||
hoveredObjects.append(_object.collider.get_parent())
|
hoveredObjects.append(_object.collider) #Get the object that have the collision
|
||||||
#endregion
|
#endregion
|
||||||
if (hoveredObjects.size() > 0):
|
if (hoveredObjects.size() > 0):
|
||||||
if (hoveredObjects.size() >= 2):
|
if (hoveredObjects.size() >= 2):
|
||||||
|
@ -72,7 +73,7 @@ func resetCast(bFull = false):
|
||||||
CastResult.clear()
|
CastResult.clear()
|
||||||
hoveredObjects.clear()
|
hoveredObjects.clear()
|
||||||
if bFull:
|
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.on_unhover()
|
||||||
hoveredObject = null
|
hoveredObject = null
|
||||||
hoveredSticker = null
|
hoveredSticker = null
|
||||||
|
@ -89,7 +90,7 @@ func sortByPosY(objects: Array, ascending_order: bool = true):
|
||||||
|
|
||||||
func comparePosY(a, b):
|
func comparePosY(a, b):
|
||||||
#print("Compare ",a," at ",a.position.y, " and ",b," at ",b.position.y )
|
#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):
|
func _input(rawInputEvent:InputEvent):
|
||||||
|
@ -106,8 +107,8 @@ func grab_start():
|
||||||
grabbedSticker = hoveredSticker
|
grabbedSticker = hoveredSticker
|
||||||
|
|
||||||
print("Grabbed ", grabbedSticker)
|
print("Grabbed ", grabbedSticker)
|
||||||
grabbedStickerOffset = grabbedSticker.position - get_global_mouse_position()
|
grabbedStickerOffset = grabbedSticker.get_parent().position - get_global_mouse_position()
|
||||||
print("offset =", grabbedStickerOffset, " Stickpos:",grabbedSticker.position,"-",get_global_mouse_position() )
|
print("offset =", grabbedStickerOffset, " Stickpos:",grabbedSticker.get_parent().position,"-",get_global_mouse_position() )
|
||||||
if (grabbedSticker.has_method("on_grab")):
|
if (grabbedSticker.has_method("on_grab")):
|
||||||
grabbedSticker.on_grab(grabbedStickerOffset)
|
grabbedSticker.on_grab(grabbedStickerOffset)
|
||||||
|
|
||||||
|
@ -117,7 +118,6 @@ func grab_end():
|
||||||
print("stopg grabbin at ",query.position )
|
print("stopg grabbin at ",query.position )
|
||||||
DebugDraw.points.append(query.position)
|
DebugDraw.points.append(query.position)
|
||||||
DebugDraw.drawPoints()
|
DebugDraw.drawPoints()
|
||||||
#TODO: Drop the sticker or maybe he will auto-drop ?
|
|
||||||
|
|
||||||
grabbedSticker = null
|
grabbedSticker = null
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ centered = false
|
||||||
offset = Vector2(-80, -190)
|
offset = Vector2(-80, -190)
|
||||||
|
|
||||||
[node name="GrabTimer" type="Timer" parent="."]
|
[node name="GrabTimer" type="Timer" parent="."]
|
||||||
wait_time = 0.5
|
wait_time = 0.3
|
||||||
one_shot = true
|
one_shot = true
|
||||||
|
|
||||||
[connection signal="animation_changed" from="AnimatedSprite2D" to="." method="_on_animated_sprite_2d_animation_changed"]
|
[connection signal="animation_changed" from="AnimatedSprite2D" to="." method="_on_animated_sprite_2d_animation_changed"]
|
||||||
|
|
107
core/Sticker.gd
107
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():
|
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
|
||||||
|
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
func on_released():
|
||||||
func _process(delta):
|
print(self," released")
|
||||||
pass
|
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_area_2d_mouse_entered():
|
func on_click():
|
||||||
pass # Replace with function body.
|
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
|
||||||
|
|
||||||
|
|
||||||
func _on_area_2d_mouse_exited():
|
#func _on_tree_entered():
|
||||||
pass # Replace with function body.
|
#if(ParentSprite != null):
|
||||||
|
#var StickerTag:Array
|
||||||
|
#StickerTag.append("sticker")
|
||||||
|
#Global.add_tags(ParentSprite,StickerTag)
|
||||||
|
|
||||||
|
|
||||||
func _on_tree_entered():
|
#func _on_tree_exited():
|
||||||
pass # Replace with function body.
|
#if(ParentSprite != null):
|
||||||
|
#var StickerTag:Array
|
||||||
|
#StickerTag.append("sticker")
|
||||||
|
#Global.remove_tags(ParentSprite,StickerTag)
|
||||||
|
|
|
@ -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
19
core/StickerArea.tscn
Normal 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"]
|
|
@ -11,7 +11,7 @@ func _process(_delta):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
func get_tags(selectedObject:Node):
|
func get_tags(selectedObject:Node):
|
||||||
var _tags: Array
|
var _tags: PackedStringArray
|
||||||
if (selectedObject.has_meta("tags")):
|
if (selectedObject.has_meta("tags")):
|
||||||
_tags = selectedObject.get_meta("tags")
|
_tags = selectedObject.get_meta("tags")
|
||||||
return _tags
|
return _tags
|
||||||
|
@ -19,19 +19,21 @@ func get_tags(selectedObject:Node):
|
||||||
printerr("no tags inside %",selectedObject)
|
printerr("no tags inside %",selectedObject)
|
||||||
return _tags
|
return _tags
|
||||||
|
|
||||||
func add_tags(selectedObject:Node,tags:Array):
|
func add_tags(selectedObject:Node,tags:PackedStringArray):
|
||||||
var _all_tags:Array
|
var _all_tags:PackedStringArray
|
||||||
if (selectedObject.has_meta("tags")):
|
if (selectedObject.has_meta("tags")):
|
||||||
_all_tags = selectedObject.get_meta("tags")
|
_all_tags = selectedObject.get_meta("tags")
|
||||||
_all_tags.append(tags)
|
_all_tags.append_array(tags)
|
||||||
selectedObject.set_meta("tags",_all_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")):
|
if (selectedObject.has_meta("tags")):
|
||||||
var _all_tags:Array
|
var _all_tags:PackedStringArray
|
||||||
_all_tags = selectedObject.get_meta("tags")
|
_all_tags = selectedObject.get_meta("tags")
|
||||||
for _tag in tags:
|
for _tag:String in tags:
|
||||||
_all_tags.erase(_tag)
|
if(_all_tags.find(_tag) !=-1):
|
||||||
|
_all_tags.remove_at(_all_tags.find(_tag))
|
||||||
|
selectedObject.set_meta("tags",_all_tags)
|
||||||
|
|
||||||
func isSticker(selectedObject:Node):
|
func isSticker(selectedObject:Node):
|
||||||
var _isSticker:bool = false
|
var _isSticker:bool = false
|
||||||
|
|
|
@ -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"]
|
[sub_resource type="AtlasTexture" id="AtlasTexture_2wdar"]
|
||||||
atlas = ExtResource("1_1wk1p")
|
|
||||||
region = Rect2(384, 64, 288, 224)
|
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"]
|
[node name="FreeSticker1" type="Sprite2D"]
|
||||||
scale = Vector2(3.80334, 3.95089)
|
scale = Vector2(3.80334, 3.95089)
|
||||||
texture = SubResource("AtlasTexture_2wdar")
|
texture = SubResource("AtlasTexture_2wdar")
|
||||||
centered = false
|
centered = false
|
||||||
offset = Vector2(-161.055, -179.785)
|
offset = Vector2(-161.055, -179.785)
|
||||||
script = SubResource("GDScript_uqtu8")
|
|
||||||
metadata/tags = ["sticker"]
|
metadata/tags = ["sticker"]
|
||||||
|
|
||||||
[node name="Area2D" type="Area2D" parent="."]
|
[node name="StickerDetection" parent="." instance=ExtResource("2_84v7t")]
|
||||||
collision_layer = 2
|
|
||||||
collision_mask = 0
|
|
||||||
monitoring = false
|
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
|
|
||||||
position = Vector2(-4.46976, -71.6294)
|
|
||||||
rotation = 1.5708
|
|
||||||
|
|
||||||
[connection signal="property_list_changed" from="." to="." method="_on_property_list_changed"]
|
[connection signal="property_list_changed" from="." to="." method="_on_property_list_changed"]
|
||||||
|
|
Loading…
Reference in a new issue