From dc2a1a78f363abaff578a8f29d9ea9b3aaa83f14 Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Sun, 22 Sep 2024 14:17:54 -0400 Subject: [PATCH] start of tossing system --- assets/shaders/outline.gdshader | 17 +++++ assets/shaders/outline.tres | 81 +++++++++++++++++++++ objects/player/player.gd | 15 ++++ objects/player/player.tscn | 20 +++-- objects/weapons/projectiles/brick.tscn | 15 +++- objects/weapons/projectiles/pickup.gd | 17 +++++ objects/weapons/projectiles/pickup.tscn | 21 ++++++ objects/weapons/projectiles/throwable.gd | 12 --- objects/weapons/projectiles/throwable.tscn | 16 ---- project.godot | 2 + test_scene.tscn | 15 +++- textures/projectiles/brick.png | Bin 729 -> 4499 bytes 12 files changed, 193 insertions(+), 38 deletions(-) create mode 100644 assets/shaders/outline.gdshader create mode 100644 assets/shaders/outline.tres create mode 100644 objects/weapons/projectiles/pickup.gd create mode 100644 objects/weapons/projectiles/pickup.tscn delete mode 100644 objects/weapons/projectiles/throwable.gd delete mode 100644 objects/weapons/projectiles/throwable.tscn diff --git a/assets/shaders/outline.gdshader b/assets/shaders/outline.gdshader new file mode 100644 index 0000000..96ef23d --- /dev/null +++ b/assets/shaders/outline.gdshader @@ -0,0 +1,17 @@ +shader_type canvas_item; + +uniform bool outline_enabled = false; +uniform vec3 outline_color : source_color = vec3(1.0); + +void fragment() { + COLOR = texture(TEXTURE, UV); + + if (outline_enabled) { + float border = texture(TEXTURE, UV + vec2(TEXTURE_PIXEL_SIZE.x, 0.0)).a; + border += texture(TEXTURE, UV - vec2(TEXTURE_PIXEL_SIZE.x, 0.0)).a; + border += texture(TEXTURE, UV + vec2(0.0, TEXTURE_PIXEL_SIZE.y)).a; + border += texture(TEXTURE, UV - vec2(0.0, TEXTURE_PIXEL_SIZE.y)).a; + float final = step(sign(border), sign(COLOR.a)); + COLOR = vec4(vec3(mix(outline_color, COLOR.rgb, final)), step(final, COLOR.a)); + } +} \ No newline at end of file diff --git a/assets/shaders/outline.tres b/assets/shaders/outline.tres new file mode 100644 index 0000000..e2c8b09 --- /dev/null +++ b/assets/shaders/outline.tres @@ -0,0 +1,81 @@ +[gd_resource type="VisualShader" load_steps=4 format=3 uid="uid://cyfnxkbtd6ehn"] + +[sub_resource type="VisualShaderNodeExpression" id="VisualShaderNodeExpression_pnln1"] +size = Vector2(400, 260) +expression = "float base = texture(tex, uv).a; +border = texture(tex, uv + vec2(TEXTURE_PIXEL_SIZE.x, 0.0)).a; +border += texture(tex, uv - vec2(TEXTURE_PIXEL_SIZE.x, 0.0)).a; +border += texture(tex, uv + vec2(0.0, TEXTURE_PIXEL_SIZE.y)).a; +border += texture(tex, uv - vec2(0.0, TEXTURE_PIXEL_SIZE.y)).a; +if (base < 0.5 && border > 0.5) { + border = 1.0; +} else { + border = 0.0; +}" + +[sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_dxtqj"] +input_name = "texture" + +[sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_ebc8y"] +output_port_for_preview = 0 +input_name = "uv" + +[resource] +code = "shader_type canvas_item; +render_mode blend_mix; + + + + +void fragment() { +// Input:4 + vec2 n_out4p0 = UV; + + + float n_out2p0; +// Expression:2 + n_out2p0 = 0.0; + { + float base = texture(TEXTURE, n_out4p0).a; + n_out2p0 = texture(TEXTURE, n_out4p0 + vec2(TEXTURE_PIXEL_SIZE.x, 0.0)).a; + n_out2p0 += texture(TEXTURE, n_out4p0 - vec2(TEXTURE_PIXEL_SIZE.x, 0.0)).a; + n_out2p0 += texture(TEXTURE, n_out4p0 + vec2(0.0, TEXTURE_PIXEL_SIZE.y)).a; + n_out2p0 += texture(TEXTURE, n_out4p0 - vec2(0.0, TEXTURE_PIXEL_SIZE.y)).a; + if (base < 0.5 && n_out2p0 > 0.5) { + n_out2p0 = 1.0; + } else { + n_out2p0 = 0.0; + } + } + + +// Output:0 + COLOR.rgb = vec3(n_out2p0); + + +} +" +graph_offset = Vector2(29.7429, 470.485) +mode = 1 +flags/light_only = false +nodes/fragment/0/position = Vector2(500, 360) +nodes/fragment/2/node = SubResource("VisualShaderNodeExpression_pnln1") +nodes/fragment/2/position = Vector2(80, 380) +nodes/fragment/2/size = Vector2(400, 260) +nodes/fragment/2/input_ports = "0,8,tex;1,3,uv;" +nodes/fragment/2/output_ports = "0,0,border;" +nodes/fragment/2/expression = "float base = texture(tex, uv).a; +border = texture(tex, uv + vec2(TEXTURE_PIXEL_SIZE.x, 0.0)).a; +border += texture(tex, uv - vec2(TEXTURE_PIXEL_SIZE.x, 0.0)).a; +border += texture(tex, uv + vec2(0.0, TEXTURE_PIXEL_SIZE.y)).a; +border += texture(tex, uv - vec2(0.0, TEXTURE_PIXEL_SIZE.y)).a; +if (base < 0.5 && border > 0.5) { + border = 1.0; +} else { + border = 0.0; +}" +nodes/fragment/3/node = SubResource("VisualShaderNodeInput_dxtqj") +nodes/fragment/3/position = Vector2(-160, 340) +nodes/fragment/4/node = SubResource("VisualShaderNodeInput_ebc8y") +nodes/fragment/4/position = Vector2(-180, 420) +nodes/fragment/connections = PackedInt32Array(3, 0, 2, 0, 4, 0, 2, 1, 2, 0, 0, 0) diff --git a/objects/player/player.gd b/objects/player/player.gd index 78bcd02..81e3fde 100644 --- a/objects/player/player.gd +++ b/objects/player/player.gd @@ -22,6 +22,7 @@ var input_dir: float = 0.0 var aim_back_arm: bool = false var _was_on_floor: bool = true +var _highlighted_pickup: Pickup = null func _ready() -> void: @@ -117,3 +118,17 @@ func _airborn_physics_process(delta: float) -> void: velocity += get_gravity() * delta #endregion #endregion + + +#region Collision Signals +func _on_pickup_area_entered(area: Area2D) -> void: + if not _highlighted_pickup: + _highlighted_pickup = area.get_parent() as Pickup + _highlighted_pickup.highlight = true + + +func _on_pickup_area_exited(area: Area2D) -> void: + if _highlighted_pickup == (area.get_parent() as Pickup): + _highlighted_pickup.highlight = false + _highlighted_pickup = null +#endregion diff --git a/objects/player/player.tscn b/objects/player/player.tscn index 7260db6..4f3e4be 100644 --- a/objects/player/player.tscn +++ b/objects/player/player.tscn @@ -23,8 +23,8 @@ [ext_resource type="Texture2D" uid="uid://d1qyuom3pxifj" path="res://textures/player/foot_front.png" id="12_dda5a"] [ext_resource type="Texture2D" uid="uid://cssnogcrn57xv" path="res://textures/player/skirt.png" id="13_qgkik"] -[sub_resource type="Animation" id="Animation_6roai"] -resource_name = "stand" +[sub_resource type="Animation" id="Animation_7ampj"] +length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true @@ -206,8 +206,8 @@ tracks/14/keys = { "values": [Vector2(1, 6)] } -[sub_resource type="Animation" id="Animation_7ampj"] -length = 0.001 +[sub_resource type="Animation" id="Animation_6roai"] +resource_name = "stand" tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true @@ -637,6 +637,14 @@ position = Vector2(-0.5, -16) shape = SubResource("RectangleShape2D_wydm2") debug_color = Color(0.720957, 0.248475, 1, 0.42) +[node name="PickupDetector" type="Area2D" parent="."] +unique_name_in_owner = true +collision_layer = 0 +collision_mask = 128 +monitorable = false + +[node name="Camera2D" type="Camera2D" parent="."] + [node name="Graphics" type="Node2D" parent="."] unique_name_in_owner = true @@ -872,8 +880,8 @@ delay_in_seconds = "0.0" editor_description = "Performs no movement." script = ExtResource("5_8e8ei") -[node name="Camera2D" type="Camera2D" parent="."] - +[connection signal="area_entered" from="PickupDetector" to="." method="_on_pickup_area_entered"] +[connection signal="area_exited" from="PickupDetector" to="." method="_on_pickup_area_exited"] [connection signal="state_physics_processing" from="StateChart/Root/Movement/Active" to="." method="_active_physics_process"] [connection signal="child_state_entered" from="StateChart/Root/Movement/Active/Grounded" to="." method="_grounded_child_state_entered"] [connection signal="state_entered" from="StateChart/Root/Movement/Active/Grounded/Standing" to="." method="_standing_entered"] diff --git a/objects/weapons/projectiles/brick.tscn b/objects/weapons/projectiles/brick.tscn index cb83080..993718c 100644 --- a/objects/weapons/projectiles/brick.tscn +++ b/objects/weapons/projectiles/brick.tscn @@ -1,18 +1,27 @@ -[gd_scene load_steps=4 format=3 uid="uid://dlnu4b8eydxui"] +[gd_scene load_steps=6 format=3 uid="uid://dlnu4b8eydxui"] -[ext_resource type="PackedScene" uid="uid://ccyfbp8cypnyy" path="res://objects/weapons/projectiles/throwable.tscn" id="1_4sas3"] +[ext_resource type="PackedScene" uid="uid://ccyfbp8cypnyy" path="res://objects/weapons/projectiles/pickup.tscn" id="1_4sas3"] [ext_resource type="Texture2D" uid="uid://bd3mcp3gds2vg" path="res://textures/projectiles/brick.png" id="2_evkjl"] +[ext_resource type="Shader" path="res://assets/shaders/outline.gdshader" id="2_irmt4"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_gpkcl"] +resource_local_to_scene = true +shader = ExtResource("2_irmt4") +shader_parameter/outline_enabled = false +shader_parameter/outline_color = Color(0.358343, 0.568333, 0.699081, 1) [sub_resource type="RectangleShape2D" id="RectangleShape2D_7kw5j"] size = Vector2(6, 4) [node name="Brick" instance=ExtResource("1_4sas3")] +material = SubResource("ShaderMaterial_gpkcl") [node name="Sprite2D" type="Sprite2D" parent="." index="0"] +use_parent_material = true texture = ExtResource("2_evkjl") [node name="CollisionShape2D" type="CollisionShape2D" parent="." index="1"] shape = SubResource("RectangleShape2D_7kw5j") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Interactable" index="0"] +[node name="CollisionShape2D2" type="CollisionShape2D" parent="Pickup" index="0"] shape = SubResource("RectangleShape2D_7kw5j") diff --git a/objects/weapons/projectiles/pickup.gd b/objects/weapons/projectiles/pickup.gd new file mode 100644 index 0000000..3fef3b3 --- /dev/null +++ b/objects/weapons/projectiles/pickup.gd @@ -0,0 +1,17 @@ +class_name Pickup +extends RigidBody2D + + +var highlight: bool: + set(value): + material.set_shader_parameter(&"outline_enabled", value) + get(): + return material.get_shader_parameter(&"outline_enabled") + + +func _ready() -> void: + pass + + +func pick_up() -> void: + freeze = true diff --git a/objects/weapons/projectiles/pickup.tscn b/objects/weapons/projectiles/pickup.tscn new file mode 100644 index 0000000..a5ea1b8 --- /dev/null +++ b/objects/weapons/projectiles/pickup.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=4 format=3 uid="uid://ccyfbp8cypnyy"] + +[ext_resource type="Shader" path="res://assets/shaders/outline.gdshader" id="1_d8t6k"] +[ext_resource type="Script" path="res://objects/weapons/projectiles/pickup.gd" id="2_wyw28"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_ocln2"] +resource_local_to_scene = true +shader = ExtResource("1_d8t6k") +shader_parameter/outline_enabled = false +shader_parameter/outline_color = Color(0.358343, 0.568333, 0.699081, 1) + +[node name="Pickup" type="RigidBody2D"] +material = SubResource("ShaderMaterial_ocln2") +collision_layer = 8 +script = ExtResource("2_wyw28") + +[node name="Pickup" type="Area2D" parent="."] +collision_layer = 128 +collision_mask = 256 +input_pickable = false +monitoring = false diff --git a/objects/weapons/projectiles/throwable.gd b/objects/weapons/projectiles/throwable.gd deleted file mode 100644 index e055e0b..0000000 --- a/objects/weapons/projectiles/throwable.gd +++ /dev/null @@ -1,12 +0,0 @@ -class_name Throwable -extends RigidBody2D - - -func _ready() -> void: - pass - - -func _on_interacted(user: Node) -> void: - var player = user as Player - if player: - player.pick_up(self) diff --git a/objects/weapons/projectiles/throwable.tscn b/objects/weapons/projectiles/throwable.tscn deleted file mode 100644 index abf8c24..0000000 --- a/objects/weapons/projectiles/throwable.tscn +++ /dev/null @@ -1,16 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://ccyfbp8cypnyy"] - -[ext_resource type="Script" path="res://objects/weapons/projectiles/throwable.gd" id="1_dsh6j"] -[ext_resource type="Script" path="res://objects/interactable.gd" id="2_b3de0"] - -[node name="Throwable" type="RigidBody2D"] -script = ExtResource("1_dsh6j") - -[node name="Interactable" type="Area2D" parent="."] -collision_layer = 64 -collision_mask = 0 -input_pickable = false -monitoring = false -script = ExtResource("2_b3de0") - -[connection signal="interacted" from="Interactable" to="." method="_on_interacted"] diff --git a/project.godot b/project.godot index 29ee1d2..3ea1ba6 100644 --- a/project.godot +++ b/project.godot @@ -87,6 +87,8 @@ interact={ 2d_physics/layer_5="hitbox" 2d_physics/layer_6="hurtbox" 2d_physics/layer_7="interactable" +2d_physics/layer_8="pickup" +2d_physics/layer_9="player_pickup" [rendering] diff --git a/test_scene.tscn b/test_scene.tscn index 47e7e7f..3c32ecf 100644 --- a/test_scene.tscn +++ b/test_scene.tscn @@ -1,12 +1,19 @@ -[gd_scene load_steps=5 format=3 uid="uid://1hsgdbtvb8tt"] +[gd_scene load_steps=8 format=3 uid="uid://1hsgdbtvb8tt"] [ext_resource type="PackedScene" uid="uid://dfx8h6eplcm6t" path="res://objects/player/player.tscn" id="1_a3fvc"] [ext_resource type="PackedScene" uid="uid://bcwkugn6v3oy7" path="res://addons/godot_state_charts/utilities/state_chart_debugger.tscn" id="1_no0gr"] [ext_resource type="Texture2D" uid="uid://e6ubhnakxe0i" path="res://icon.svg" id="2_8xgwn"] +[ext_resource type="PackedScene" uid="uid://dlnu4b8eydxui" path="res://objects/weapons/projectiles/brick.tscn" id="4_7tv2f"] +[ext_resource type="Shader" path="res://assets/shaders/outline.gdshader" id="5_732g5"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_yvk4l"] size = Vector2(265, 20) +[sub_resource type="ShaderMaterial" id="ShaderMaterial_oufer"] +resource_local_to_scene = true +shader = ExtResource("5_732g5") +shader_parameter/outline_color = Color(0.358343, 0.568333, 0.699081, 1) + [node name="TestScene" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] @@ -25,6 +32,7 @@ position = Vector2(196, 151) [node name="StaticBody2D" type="StaticBody2D" parent="."] position = Vector2(168, 225) +rotation = -0.188756 [node name="CollisionShape2D" type="CollisionShape2D" parent="StaticBody2D"] position = Vector2(2.5, 0) @@ -41,3 +49,8 @@ visible = false [node name="StateChartDebugger" parent="CanvasLayer" instance=ExtResource("1_no0gr")] offset_right = -159.0 initial_node_to_watch = NodePath("../../Player") + +[node name="Brick" parent="." instance=ExtResource("4_7tv2f")] +material = SubResource("ShaderMaterial_oufer") +position = Vector2(272, 121) +rotation = -1.62322 diff --git a/textures/projectiles/brick.png b/textures/projectiles/brick.png index 812d7a3205d6b88be8d340c8c8270062512ddc32..46da5a2e047d92c03e85aee5f19629375ddc3b18 100644 GIT binary patch literal 4499 zcmeHLeQ*=U6+hXy7K+UzM8pGyaFLT3f={|ToxZM;!I6Zef{c(=B&SU9>9n%1NIKSwlC)=OLFpVBX z{RzMS9(Cm=5KO}~Wj)Qfah0YTQ>=DCo1v+~Wb1)A{vlHWIBtUOxv~EUYJ&%8$BgG7q)`_2EpwP z`rU3kBZ&zii7>42v+rzo`F^)#?#P;sLGL~53B#prd)aedFZ-=oj|A^Ht$U8$z4}^B zV9pMGL)+0q7cagXJ9BiTGg2FAz4ip4-Xp{NkLMnJ+!woL**5&%)_N4~YFzqk z`y(5f51NLqwyl1_W8AnJky7(xy88WBYCn7E?F;v9{H5Qta2HlwGxr_7PWyh2)<1Kix9C zuy%vkKWy1|_%AK(^B=6s{dh<-V@Cf+2DC5Vm;d#F!{0k`@Y*MuldN?7^xR!bAdd?| zI4Va2%UNDb8M(L^L&icXqn@L4aUsL;Ymtn{P`8kF89w~&3kF<>y9^OafDB~Zs7LS> zCDc)D5A(&fyd!Q{+@f<9SO7>NnZpaIWID?hTm}`Fg|Q+w8E{oaUh6VMA=})dgmA{l z7)iog5PE4tiw<{6@dO+4EG1{|X5sAw&y!Y~PdF&bZW#yVPiJK=%_9X0z>Nan zP*RH zD`h7bE5j2GlD81n1ZSZfyp3lpvDkNng6BSIg!m2CEv9Pci zAeK||6aZ8??1fd!s3?U+G3hc?YI9{d0M{wb$(#qOI)GNHb$GN|6C~8{Quqp7K#U8C zzW=AKTprvB`f%hvAuEegpDHTds1Ec%X;zvh1@$W7xOypAjxTK?%k`qT8Yf_tmiQhn z-Ho7nl+$%oE__ZZ#1I!xkk$kdqu_EgRvSk+5JeMqJ4rfX7AxW`_KE0OF(KzU3AJ_u zkH8hAr}}pcU!We;!in1X9;BQC5Jr%8f~H3avz7@nl{aisYR2e}ou(T&ajFXAiVWD5 zWKg`I7Md!>u*{iKcD}@?d=_7#2Y{Y(GAVwi=$fKyQVdK=c`Cc6=$aG*lTx0_t}l!( z-Pr3CO2dCad3aeGIzF%tUbTK0TpsowKL6bY++0Yt2!bCV&JIqBE>hzEl0u6Z503ls?%w0>9l$jzie`1i0Zq5fbTT1ibE`t=6=4j3 z#}Gy(#WLnZF$Lf8b&mjB?_w;=|9{+{qgTya3J?&8YC7d}S&vo5Ta2|zO=;be zy)cs3SC*Mha|B5&VhJJy$f%)=3T(t^)k(3Cru~GEf7tblwi{pHZ0ij)>S$CZ8W5;Qp0KsSAN^kqC4Pf?@^m<#19szyZz{Pc2 zllOqj9boXukW9&yf;7280eC;7Z^{Avw?NOD*IR2Jrw>4ex=P&u2Zz9Tk+Ro)-W~4j z?cX!4{(bb6k?E+l9rN|WDt^;l9B@QKw^>rABzGytDh*x00000NkvXXu0mjf DV)@{H