From 1759022dee95677cc12b59308734ec424efa8fbf Mon Sep 17 00:00:00 2001 From: Antonio Dell'Annunziata Date: Sun, 23 Feb 2025 15:53:34 +0100 Subject: [PATCH] Add cut points --- guideline_point.gd | 18 +++ guidelines.gd | 13 +++ project.godot | 4 + prototype_dark_cut.gd | 4 + prototype_dark_cut.tscn | 239 +++++++++++++++++++++++++++++----------- test_scalpel.gd | 23 +++- 6 files changed, 236 insertions(+), 65 deletions(-) create mode 100644 guideline_point.gd create mode 100644 guidelines.gd diff --git a/guideline_point.gd b/guideline_point.gd new file mode 100644 index 0000000..44b9b67 --- /dev/null +++ b/guideline_point.gd @@ -0,0 +1,18 @@ +class_name GuidelinePoint +extends Sprite2D + +@export_node_path("Node2D") var connections: Array[NodePath] = [] + +@onready var area = $Area2D + +var scalpel: Scalpel + +func _ready(): + area.connect("area_exited", _on_area_entered) + scalpel = get_tree().get_first_node_in_group("cutter") + + +func _on_area_entered(area: Area2D): + if area != scalpel.cut_area or not scalpel.is_cutting: return + queue_free() + diff --git a/guidelines.gd b/guidelines.gd new file mode 100644 index 0000000..d325e77 --- /dev/null +++ b/guidelines.gd @@ -0,0 +1,13 @@ +extends Node2D + +class Connection: + var source: NodePath + var targets: Array[NodePath] + +var guideline_points: Array[Node] + +func _ready(): + guideline_points = get_children().filter(func(c): return c is GuidelinePoint) + +func _process(delta): + if get_child_count() == 0: get_parent().operation_succeeded() diff --git a/project.godot b/project.godot index 0697663..21fc49d 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="res://prototype_dark_cut.tscn" config/features=PackedStringArray("4.3", "GL Compatibility") config/icon="res://icon.svg" +[display] + +window/stretch/mode="viewport" + [rendering] renderer/rendering_method="gl_compatibility" diff --git a/prototype_dark_cut.gd b/prototype_dark_cut.gd index 77063a8..30fb394 100644 --- a/prototype_dark_cut.gd +++ b/prototype_dark_cut.gd @@ -5,3 +5,7 @@ extends Node func _on_patience_bar_value_changed(value): if value <= 0: get_tree().reload_current_scene() + +func operation_succeeded(): + get_tree().reload_current_scene() + diff --git a/prototype_dark_cut.tscn b/prototype_dark_cut.tscn index 903f9d6..4806cdb 100644 --- a/prototype_dark_cut.tscn +++ b/prototype_dark_cut.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://be0rqt7sk1da0"] +[gd_scene load_steps=14 format=3 uid="uid://be0rqt7sk1da0"] [ext_resource type="Texture2D" uid="uid://bicjfwpoa3pma" path="res://test_table.png" id="1_7i8d4"] [ext_resource type="Script" path="res://prototype_dark_cut.gd" id="1_vl0qk"] @@ -6,6 +6,8 @@ [ext_resource type="Texture2D" uid="uid://cg3dg7iqif56d" path="res://test_scalpel.png" id="3_a4jra"] [ext_resource type="Script" path="res://test_scalpel.gd" id="4_5ba3g"] [ext_resource type="Texture2D" uid="uid://gf7us6an3mhu" path="res://test_star.png" id="4_frsoy"] +[ext_resource type="Script" path="res://guidelines.gd" id="6_0fd2w"] +[ext_resource type="Script" path="res://guideline_point.gd" id="8_5qgyw"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pgu75"] bg_color = Color(0.417457, 0, 0.105249, 1) @@ -20,6 +22,8 @@ height = 142.904 [sub_resource type="CircleShape2D" id="CircleShape2D_qmwrh"] radius = 5.65684 +[sub_resource type="CircleShape2D" id="CircleShape2D_0bwgd"] + [node name="PrototypeDarkCut" type="Node"] script = ExtResource("1_vl0qk") @@ -62,7 +66,6 @@ texture = ExtResource("1_7i8d4") [node name="Area2D" type="Area2D" parent="UtilsDropoff"] [node name="CollisionShape2D" type="CollisionShape2D" parent="UtilsDropoff/Area2D"] -scale = Vector2(1, 1) shape = SubResource("RectangleShape2D_m114t") [node name="TestTable" type="Sprite2D" parent="."] @@ -78,7 +81,7 @@ texture = ExtResource("2_atjyl") [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="TestBody1/Area2D"] polygon = PackedVector2Array(0, -250, -39.2, -250, -45.6, -246, -48.9, -246, -54.9, -239, -56.2, -239, -61.1, -230, -62.6, -230, -67.5, -210, -69, -210, -69, -181.7, -65, -168, -65, -163.3, -49, -143, -47, -128.8, -47, -124.8, -63.3, -122, -67.3, -122, -102.9, -109.8, -113.5, -116, -124.4, -116, -148.3, -106, -150, -106, -150, 49.2, -146, 67.4, -146, 71.4, -138, 93.4, -138, 99.7, -132, 106.7, -132, 109, -115.2, 109, -108.2, 102, -106.5, 102, -101.5, 86, -100, 86, -99, 35, -99, 16.8, -96.5, 26, -96, 93, -100, 140.9, -100, 163.1, -95.7, 192, -94.9, 192, -91, 246.1, -91, 250, 61, 250, 61, 236.5, 58, 230.5, 58, 217.1, 68, 38.1, 68, 64.3, 74, 82.3, 74, 85, 82, 91, 82, 92.8, 93, 93.8, 93, 95, 109.8, 95, 117.7, 88, 119.8, 88, 128.8, 9, 129.9, 9, 131.9, -42, 133.1, -42, 132, -84, 132, -90.7, 121, -103.8, 121, -105.6, 113, -107.6, 113, -109.2, 90.1, -107.1, 87, -112.5, 87, -114.9, 75, -125, 75, -127.2, 44.8, -124, 31.2, -124, 33, -144.9, 33, -151.3, 48.9, -169, 50.4, -169, 54.4, -179, 56, -179, 56, -200.6, 43, -219.7, 43, -222, 30, -232, 30, -233.2, 0, -248.3) -[node name="TestScalpel" type="Sprite2D" parent="."] +[node name="TestScalpel" type="Sprite2D" parent="." groups=["cutter"]] position = Vector2(949, 41) rotation = -2.0542 scale = Vector2(0.5, 0.5) @@ -88,7 +91,6 @@ script = ExtResource("4_5ba3g") [node name="PickupArea" type="Area2D" parent="TestScalpel"] [node name="CollisionShape2D" type="CollisionShape2D" parent="TestScalpel/PickupArea"] -scale = Vector2(1, 1) shape = SubResource("CapsuleShape2D_jndi4") [node name="CutArea" type="Area2D" parent="TestScalpel"] @@ -102,86 +104,199 @@ debug_color = Color(0.879882, 0.304191, 0.394852, 0.42) unique_name_in_owner = true [node name="Guidelines" type="Node2D" parent="."] +script = ExtResource("6_0fd2w") -[node name="TestStar3" type="Sprite2D" parent="Guidelines"] +[node name="TestStar_1" type="Sprite2D" parent="Guidelines"] position = Vector2(557, 313) scale = Vector2(0.5, 0.5) texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_2")]) -[node name="TestStar8" type="Sprite2D" parent="Guidelines"] -position = Vector2(594, 399) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_1"] -[node name="TestStar11" type="Sprite2D" parent="Guidelines"] -position = Vector2(552, 398) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_1/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") -[node name="TestStar17" type="Sprite2D" parent="Guidelines"] -position = Vector2(572, 398) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") - -[node name="TestStar12" type="Sprite2D" parent="Guidelines"] -position = Vector2(666, 403) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") - -[node name="TestStar16" type="Sprite2D" parent="Guidelines"] -position = Vector2(646, 402) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") - -[node name="TestStar9" type="Sprite2D" parent="Guidelines"] -position = Vector2(626, 401) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") - -[node name="TestStar2" type="Sprite2D" parent="Guidelines"] -position = Vector2(609, 385) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") - -[node name="TestStar4" type="Sprite2D" parent="Guidelines"] -position = Vector2(609, 345) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") - -[node name="TestStar13" type="Sprite2D" parent="Guidelines"] -position = Vector2(608, 368) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") - -[node name="TestStar5" type="Sprite2D" parent="Guidelines"] -position = Vector2(647, 322) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") - -[node name="TestStar15" type="Sprite2D" parent="Guidelines"] -position = Vector2(627, 324) -scale = Vector2(0.5, 0.5) -texture = ExtResource("4_frsoy") - -[node name="TestStar10" type="Sprite2D" parent="Guidelines"] +[node name="TestStar_2" type="Sprite2D" parent="Guidelines"] position = Vector2(574, 318) scale = Vector2(0.5, 0.5) texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_1"), NodePath("../TestStar_3")]) -[node name="TestStar14" type="Sprite2D" parent="Guidelines"] +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_2"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_2/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_3" type="Sprite2D" parent="Guidelines"] position = Vector2(593, 323) scale = Vector2(0.5, 0.5) texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_2"), NodePath("../TestStar_4")]) -[node name="TestStar6" type="Sprite2D" parent="Guidelines"] +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_3"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_3/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_4" type="Sprite2D" parent="Guidelines"] position = Vector2(609, 324) scale = Vector2(0.5, 0.5) texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_3"), NodePath("../TestStar_5"), NodePath("../TestStar_8")]) -[node name="TestStar7" type="Sprite2D" parent="Guidelines"] +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_4"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_4/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_5" type="Sprite2D" parent="Guidelines"] +position = Vector2(627, 324) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_4"), NodePath("../TestStar_6")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_5"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_5/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_6" type="Sprite2D" parent="Guidelines"] +position = Vector2(647, 322) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_5"), NodePath("../TestStar_7")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_6"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_6/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_7" type="Sprite2D" parent="Guidelines"] position = Vector2(666, 318) scale = Vector2(0.5, 0.5) texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_6")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_7"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_7/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_8" type="Sprite2D" parent="Guidelines"] +position = Vector2(609, 345) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_4"), NodePath("../TestStar_9")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_8"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_8/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_9" type="Sprite2D" parent="Guidelines"] +position = Vector2(608, 368) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_8"), NodePath("../TestStar_910")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_9"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_9/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_910" type="Sprite2D" parent="Guidelines"] +position = Vector2(609, 385) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_9"), NodePath("../TestStar_911"), NodePath("../TestStar_914")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_910"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_910/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_911" type="Sprite2D" parent="Guidelines"] +position = Vector2(594, 399) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_910"), NodePath("../TestStar_912")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_911"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_911/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_912" type="Sprite2D" parent="Guidelines"] +position = Vector2(572, 398) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_911"), NodePath("../TestStar_913")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_912"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_912/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_913" type="Sprite2D" parent="Guidelines"] +position = Vector2(552, 398) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_912")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_913"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_913/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_914" type="Sprite2D" parent="Guidelines"] +position = Vector2(626, 401) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_910"), NodePath("../TestStar_915")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_914"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_914/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar_915" type="Sprite2D" parent="Guidelines"] +position = Vector2(646, 402) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_914"), NodePath("../TestStar1_916")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar_915"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar_915/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") + +[node name="TestStar1_916" type="Sprite2D" parent="Guidelines"] +position = Vector2(666, 403) +scale = Vector2(0.5, 0.5) +texture = ExtResource("4_frsoy") +script = ExtResource("8_5qgyw") +connections = Array[NodePath]([NodePath("../TestStar_915")]) + +[node name="Area2D" type="Area2D" parent="Guidelines/TestStar1_916"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Guidelines/TestStar1_916/Area2D"] +shape = SubResource("CircleShape2D_0bwgd") [connection signal="value_changed" from="UI/HBoxContainer/PatienceBar" to="." method="_on_patience_bar_value_changed"] [connection signal="area_entered" from="UtilsDropoff/Area2D" to="TestScalpel" method="_on_dropoff_area_entered"] diff --git a/test_scalpel.gd b/test_scalpel.gd index 71a929b..3024fb0 100644 --- a/test_scalpel.gd +++ b/test_scalpel.gd @@ -1,3 +1,4 @@ +class_name Scalpel extends Sprite2D var is_clickable = false @@ -17,12 +18,12 @@ func _input(event: InputEvent): if event is InputEventMouseButton and event.is_pressed(): if is_picked_up: if is_dropable: - is_picked_up = false + _drop_scalpel() elif is_cutting_possible: start_cutting() elif is_clickable: - is_picked_up = true - elif event is InputEventMouseButton and event.is_released(): + _pickup_scalpel() + if event is InputEventMouseButton and event.is_released(): if is_cutting: stop_cutting() if is_picked_up and event is InputEventMouseMotion: @@ -49,9 +50,24 @@ func _on_body_area_exited(area): is_cutting_possible = false stop_cutting() +func _pickup_scalpel(): + is_picked_up = true + Input.mouse_mode = Input.MOUSE_MODE_HIDDEN + +func _drop_scalpel(): + is_picked_up = false + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + +func _exit_tree(): + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + +var _scalpel_degrees_default: float +const SCALPEL_ROTATION_CUTTING = -90.0 func start_cutting(): if is_cutting: return print("Start cut") + _scalpel_degrees_default = rotation_degrees + rotation_degrees = SCALPEL_ROTATION_CUTTING _on_cut_hurt_timer_timeout() %CutHurtTimer.start(1) is_cutting = true @@ -59,6 +75,7 @@ func start_cutting(): func stop_cutting(): if not is_cutting: return print("Stop cut") + rotation_degrees = _scalpel_degrees_default %CutHurtTimer.stop() is_cutting = false