From 68b3e1132f282bc2cb4325a7ff6e1547f4978276 Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Mon, 17 Mar 2025 04:43:58 -0400 Subject: [PATCH] silly sparks thing --- assets/audio/sfx/spark_bounce.ogg | Bin 0 -> 8088 bytes assets/audio/sfx/spark_bounce.ogg.import | 19 ++++++++ assets/textures/effects/spark.png | Bin 0 -> 636 bytes assets/textures/effects/spark.png.import | 34 ++++++++++++++ autoloads/scene_manager.tscn | 1 + maps/level_z.tscn | 6 +-- objects/effects/bouncing_spark.gd | 35 ++++++++++++++ objects/effects/bouncing_spark.gd.uid | 1 + objects/effects/bouncing_spark.tscn | 57 +++++++++++++++++++++++ objects/player/player.gd | 10 ++++ objects/player/player.tscn | 17 +++++-- 11 files changed, 172 insertions(+), 8 deletions(-) create mode 100644 assets/audio/sfx/spark_bounce.ogg create mode 100644 assets/audio/sfx/spark_bounce.ogg.import create mode 100644 assets/textures/effects/spark.png create mode 100644 assets/textures/effects/spark.png.import create mode 100644 objects/effects/bouncing_spark.gd create mode 100644 objects/effects/bouncing_spark.gd.uid create mode 100644 objects/effects/bouncing_spark.tscn diff --git a/assets/audio/sfx/spark_bounce.ogg b/assets/audio/sfx/spark_bounce.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4810a23afc202b4c352d74cfa9c787760a6dab63 GIT binary patch literal 8088 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 literal 0 HcmV?d00001 diff --git a/assets/audio/sfx/spark_bounce.ogg.import b/assets/audio/sfx/spark_bounce.ogg.import new file mode 100644 index 0000000..ef15a05 --- /dev/null +++ b/assets/audio/sfx/spark_bounce.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://cmvbwm6gk8n6b" +path="res://.godot/imported/spark_bounce.ogg-224666db975db87c427084fd6483ed17.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/sfx/spark_bounce.ogg" +dest_files=["res://.godot/imported/spark_bounce.ogg-224666db975db87c427084fd6483ed17.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/textures/effects/spark.png b/assets/textures/effects/spark.png new file mode 100644 index 0000000000000000000000000000000000000000..ab73f1188b863206a24ce5e0ab294163e4096f3e GIT binary patch literal 636 zcmV-?0)zdDP)EX>4Tx04R}tkv&MmP!xqvQ$>+VhjtKg$WWc^q9VH0DionYs1;guFnQ@8G-*gu zTpR`0f`dPcRRqzlK0s(znP&AQ08O{e zOe!hn@~dLsD}o3kLNzNh%b1g-G)WQiH^gTvt4P<6LrC;F(b~o0%t$5{soSR=Sv#O^tYpIHqbkCqVESxY9fRS`(Q0B)!qm zVn;xD8@RacXv!XNxdRM68L}z6Qjkh07J>IO`ldV(xdjH+yt%c{aryvcX;$eQ;NTD# zD^d2k&%67(=l1WN_WXVTut##gU|hr000006VoOIv00000008+zyMF)x010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=>rcF8U#yxsfPdn02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{002};L_t&-(}j+^4S+BZL*GT2Abko(VoN#}VFaWUshPoP zC{C6Tue1D-AtC9+D5krIss%P*sA;+b4QP@cU;wiuGq(pYBVxx+UT^#J!_6O(j;t3H Wsv~sk?6&3r0000 void: + var rnd_scale = randf_range(scale_min, scale_max) + $Sprite2D.scale = Vector2.ONE * rnd_scale + + linear_velocity = Vector2.from_angle(randf() * TAU) * randf_range(velocity_min, velocity_max) + angular_velocity = randf_range(spin_min, spin_max) + + +func _physics_process(delta: float) -> void: + if linear_velocity.length() <= decay_speed_threshold: + if _tween: + return + _tween = create_tween().set_process_mode(Tween.TWEEN_PROCESS_PHYSICS) + _tween.tween_property(self, ^"scale", Vector2.ZERO, decay_time) + _tween.tween_callback(queue_free) + + +func _on_solid_detector_body_entered(body: Node2D) -> void: + print("BLEP") diff --git a/objects/effects/bouncing_spark.gd.uid b/objects/effects/bouncing_spark.gd.uid new file mode 100644 index 0000000..48a2682 --- /dev/null +++ b/objects/effects/bouncing_spark.gd.uid @@ -0,0 +1 @@ +uid://b6krgij5xfu1w diff --git a/objects/effects/bouncing_spark.tscn b/objects/effects/bouncing_spark.tscn new file mode 100644 index 0000000..8eeb0ec --- /dev/null +++ b/objects/effects/bouncing_spark.tscn @@ -0,0 +1,57 @@ +[gd_scene load_steps=8 format=3 uid="uid://djdpcsmms727b"] + +[ext_resource type="Script" uid="uid://b6krgij5xfu1w" path="res://objects/effects/bouncing_spark.gd" id="1_62ynp"] +[ext_resource type="Texture2D" uid="uid://rhc3c5j1lfw" path="res://assets/textures/effects/spark.png" id="1_ag5ij"] +[ext_resource type="AudioStream" uid="uid://cmvbwm6gk8n6b" path="res://assets/audio/sfx/spark_bounce.ogg" id="3_4uvf2"] + +[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_62ynp"] +bounce = 0.8 + +[sub_resource type="CircleShape2D" id="CircleShape2D_4uvf2"] +radius = 2.0 + +[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_us66k"] +random_pitch = 1.25 +streams_count = 1 +stream_0/stream = ExtResource("3_4uvf2") + +[sub_resource type="CircleShape2D" id="CircleShape2D_us66k"] +radius = 6.0 + +[node name="Spark" type="RigidBody2D"] +z_index = -10 +collision_layer = 0 +collision_mask = 3 +mass = 0.1 +physics_material_override = SubResource("PhysicsMaterial_62ynp") +gravity_scale = 0.25 +linear_damp = 0.3 +script = ExtResource("1_62ynp") +scale_min = 0.5 +scale_max = 1.0 +velocity_min = 40.0 +velocity_max = 80.0 +spin_min = -1.5708 +spin_max = 1.5708 +decay_speed_threshold = 15.0 +decay_time = 0.2 + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("1_ag5ij") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_4uvf2") + +[node name="BounceSound" type="AudioStreamPlayer2D" parent="."] +stream = SubResource("AudioStreamRandomizer_us66k") +bus = &"Sound Effects" + +[node name="SolidDetector" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 3 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="SolidDetector"] +shape = SubResource("CircleShape2D_us66k") + +[connection signal="body_entered" from="SolidDetector" to="." method="_on_solid_detector_body_entered"] +[connection signal="body_entered" from="SolidDetector" to="BounceSound" method="play" unbinds=1] diff --git a/objects/player/player.gd b/objects/player/player.gd index 20dcd43..8bf6459 100644 --- a/objects/player/player.gd +++ b/objects/player/player.gd @@ -7,8 +7,12 @@ extends CharacterBody2D @export var max_run_speed: float @export var turn_acceleration: float @export var stopping_force: float + +@export_group("Bonk") @export var bonk_speed_threshold: float @export var bonk_power: float +@export var bonk_effect_count: int +@export var bonk_effect_scene: PackedScene @export_group("Air Movement") @export var gravity: float @@ -30,6 +34,8 @@ extends CharacterBody2D @export var corner_snap_point: Node2D @export var vault_off_point: Node2D +@export var bonk_effect_point: Node2D + @onready var start_position: Vector2 = global_position @@ -113,6 +119,10 @@ func _cancel_bonk() -> void: func _apply_bonk() -> void: velocity.x = signf(_bonk_cancel_velocity.x) * bonk_power + for _i in bonk_effect_count: + var effect_instance = bonk_effect_scene.instantiate() + effect_instance.global_position = global_position + get_parent().add_child(effect_instance) #endregion diff --git a/objects/player/player.tscn b/objects/player/player.tscn index 7bd3388..f78ad35 100644 --- a/objects/player/player.tscn +++ b/objects/player/player.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=36 format=3 uid="uid://bwtpsjpe2lf7l"] +[gd_scene load_steps=37 format=3 uid="uid://bwtpsjpe2lf7l"] [ext_resource type="Script" uid="uid://dhyi4yn0xleoy" path="res://objects/player/player.gd" id="1_xs4s5"] +[ext_resource type="PackedScene" uid="uid://djdpcsmms727b" path="res://objects/effects/bouncing_spark.tscn" id="2_28utn"] [ext_resource type="Texture2D" uid="uid://c71nqfyw4a3v4" path="res://assets/textures/player/capri.png" id="3_trcll"] [ext_resource type="Script" uid="uid://cv55s54clajw5" path="res://scripts/spritesheet_animation/spritesheet_animation.gd" id="4_bsdw5"] [ext_resource type="AudioStream" uid="uid://4kxio0mlrr4k" path="res://assets/audio/vox/capri_jump2.ogg" id="5_45urx"] @@ -108,7 +109,7 @@ script = ExtResource("8_8i2im") expression = "velocity.y > 0.0" metadata/_custom_type_script = "uid://b6u7unac5srh0" -[node name="Player" type="CharacterBody2D" node_paths=PackedStringArray("state_chart", "graphics", "run_animation", "wall_cast", "corner_cast", "corner_height_cast", "corner_snap_point", "vault_off_point")] +[node name="Player" type="CharacterBody2D" node_paths=PackedStringArray("state_chart", "graphics", "run_animation", "wall_cast", "corner_cast", "corner_height_cast", "corner_snap_point", "vault_off_point", "bonk_effect_point")] collision_layer = 16 collision_mask = 3 floor_snap_length = 3.0 @@ -119,6 +120,8 @@ turn_acceleration = 300.0 stopping_force = 250.0 bonk_speed_threshold = 75.0 bonk_power = 80.0 +bonk_effect_count = 3 +bonk_effect_scene = ExtResource("2_28utn") gravity = 450.0 fast_gravity = 675.0 jump_power = 180.0 @@ -134,6 +137,7 @@ corner_cast = NodePath("Graphics/CornerDetector/CornerCast") corner_height_cast = NodePath("Graphics/CornerDetector/CornerHeightCast") corner_snap_point = NodePath("Graphics/CornerDetector/CornerSnapPoint") vault_off_point = NodePath("Graphics/CornerDetector/VaultOffPoint") +bonk_effect_point = NodePath("Graphics/SparksPoint") [node name="CollisionShape" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_tvyy1") @@ -232,6 +236,9 @@ position = Vector2(4, 2) [node name="VaultOffPoint" type="Node2D" parent="Graphics/CornerDetector"] position = Vector2(2, 7) +[node name="SparksPoint" type="Node2D" parent="Graphics"] +position = Vector2(8, 0) + [node name="Sounds" type="Node" parent="."] [node name="Jump" type="AudioStreamPlayer" parent="Sounds"] @@ -517,16 +524,16 @@ delay_in_seconds = "0.0" [connection signal="state_physics_processing" from="StateChart/Root/Grounded" to="." method="_check_for_bonk"] [connection signal="state_entered" from="StateChart/Root/Grounded/Standing/Idle" to="Graphics/Sprite/Idle" method="play"] [connection signal="state_entered" from="StateChart/Root/Grounded/Standing/Stopping" to="Graphics/Sprite/Run" method="play"] -[connection signal="state_physics_processing" from="StateChart/Root/Grounded/Standing/Stopping" to="." method="_slow_to_stop"] [connection signal="state_physics_processing" from="StateChart/Root/Grounded/Standing/Stopping" to="." method="_scale_run_animation"] +[connection signal="state_physics_processing" from="StateChart/Root/Grounded/Standing/Stopping" to="." method="_slow_to_stop"] [connection signal="state_entered" from="StateChart/Root/Grounded/Running" to="Graphics/Sprite/Run" method="play"] [connection signal="state_physics_processing" from="StateChart/Root/Grounded/Running" to="." method="_scale_run_animation"] [connection signal="state_physics_processing" from="StateChart/Root/Grounded/Running" to="." method="_apply_run_acceleration"] [connection signal="state_entered" from="StateChart/Root/Grounded/Turning" to="Graphics/Sprite/Skid" method="play"] [connection signal="state_physics_processing" from="StateChart/Root/Grounded/Turning" to="." method="_apply_turn_acceleration"] -[connection signal="state_physics_processing" from="StateChart/Root/Airborne" to="." method="_apply_gravity"] -[connection signal="state_physics_processing" from="StateChart/Root/Airborne" to="." method="_check_for_corner"] [connection signal="state_physics_processing" from="StateChart/Root/Airborne" to="." method="_check_for_bonk"] +[connection signal="state_physics_processing" from="StateChart/Root/Airborne" to="." method="_check_for_corner"] +[connection signal="state_physics_processing" from="StateChart/Root/Airborne" to="." method="_apply_gravity"] [connection signal="state_entered" from="StateChart/Root/Airborne/Falling" to="Graphics/Sprite/Fall" method="play"] [connection signal="state_entered" from="StateChart/Root/Airborne/Jumping" to="Graphics/Sprite/Jump" method="play"] [connection signal="state_entered" from="StateChart/Root/Airborne/Jumping/FromGround" to="." method="_start_jump"]