From 384e8560f6dd946462ccc494434045fcede1c986 Mon Sep 17 00:00:00 2001 From: Ivan Kuzmenko <6745157+rndtrash@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:19:00 +0300 Subject: [PATCH] Crank sound --- scenes/main_scene.tscn | 19 +++++++++++++------ scripts/Flashlight.cs | 30 +++++++++++++++++++----------- scripts/GameCamera.cs | 4 ++-- sounds/crank.ogg | Bin 0 -> 10224 bytes sounds/crank.ogg.import | 19 +++++++++++++++++++ 5 files changed, 53 insertions(+), 19 deletions(-) create mode 100644 sounds/crank.ogg create mode 100644 sounds/crank.ogg.import diff --git a/scenes/main_scene.tscn b/scenes/main_scene.tscn index dfefed4..d0a7101 100644 --- a/scenes/main_scene.tscn +++ b/scenes/main_scene.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=17 format=3 uid="uid://dhn7yt46fyac8"] +[gd_scene load_steps=18 format=3 uid="uid://dhn7yt46fyac8"] [ext_resource type="PackedScene" uid="uid://bhulqhxesd5gc" path="res://prefabs/player.tscn" id="1_65a7v"] +[ext_resource type="AudioStream" uid="uid://bsy2d0bl3lgg0" path="res://sounds/crank.ogg" id="1_cweq4"] [ext_resource type="Texture2D" uid="uid://py6qiu3rm7cu" path="res://sprites/brickwall.png" id="2_edqdh"] [ext_resource type="Texture2D" uid="uid://dlbl6d4yghvht" path="res://sprites/mask.png" id="3_8o315"] [ext_resource type="Script" path="res://scripts/Flashlight.cs" id="3_cylxo"] @@ -19,7 +20,7 @@ light_mode = 2 [sub_resource type="ShaderMaterial" id="ShaderMaterial_m680d"] shader = ExtResource("5_64d71") -[sub_resource type="ViewportTexture" id="ViewportTexture_0u602"] +[sub_resource type="ViewportTexture" id="ViewportTexture_nebfb"] viewport_path = NodePath("FlashlightViewport") [sub_resource type="CircleShape2D" id="CircleShape2D_prnh4"] @@ -36,10 +37,12 @@ light_mode = 2 [node name="Root" type="Node2D"] y_sort_enabled = true -[node name="Player" parent="." instance=ExtResource("1_65a7v")] -position = Vector2(19, 4) +[node name="Sounds" type="Node" parent="."] -[node name="Controller" type="Node" parent="." node_paths=PackedStringArray("Player", "Camera", "Circle", "PlayerCircle", "Polygon", "CollisionCircle", "CollisionPlayerCircle", "CollisionPolygon", "FlashlightGroup")] +[node name="CrankSound" type="AudioStreamPlayer" parent="Sounds"] +stream = ExtResource("1_cweq4") + +[node name="FlashlightController" type="Node" parent="." node_paths=PackedStringArray("Player", "Camera", "Circle", "PlayerCircle", "Polygon", "CollisionCircle", "CollisionPlayerCircle", "CollisionPolygon", "FlashlightGroup", "CrankSoundPlayer")] script = ExtResource("3_cylxo") Player = NodePath("../Player") Camera = NodePath("../PlayerCamera") @@ -51,6 +54,10 @@ CollisionPlayerCircle = NodePath("../PlayerCamera/Area2D/PlayerCircle") CollisionPolygon = NodePath("../PlayerCamera/Area2D/CollisionPolygon2D") FlashlightGroup = NodePath("../FlashlightViewport/CanvasGroup") BrightnessCurve = SubResource("Curve_o5byr") +CrankSoundPlayer = NodePath("../Sounds/CrankSound") + +[node name="Player" parent="." instance=ExtResource("1_65a7v")] +position = Vector2(19, 4) [node name="TestWall" type="Sprite2D" parent="."] light_mask = 2 @@ -95,7 +102,7 @@ CameraBounds = Vector2(30, 20) [node name="PointLight2D" type="PointLight2D" parent="PlayerCamera" node_paths=PackedStringArray("LightViewport")] blend_mode = 2 range_item_cull_mask = 2 -texture = SubResource("ViewportTexture_0u602") +texture = SubResource("ViewportTexture_nebfb") script = ExtResource("6_slohe") LightViewport = NodePath("../../FlashlightViewport") diff --git a/scripts/Flashlight.cs b/scripts/Flashlight.cs index 9648f29..6efe809 100644 --- a/scripts/Flashlight.cs +++ b/scripts/Flashlight.cs @@ -14,13 +14,15 @@ public partial class Flashlight : Node [Export] public CollisionShape2D CollisionPlayerCircle; [Export] public CollisionPolygon2D CollisionPolygon; [Export] public CanvasGroup FlashlightGroup; - + [Export] public Curve BrightnessCurve; - + + [Export] public AudioStreamPlayer CrankSoundPlayer; + private float FlashlightRadius = Constants.MaxFlashlightRadius; private float FlashlightEnergy = Constants.MaxFlashlightEnergy; private float FlashlightChargeTimeout = 1; - + public override void _Ready() { base._Ready(); @@ -44,7 +46,7 @@ public partial class Flashlight : Node FlashlightRadius = Mathf.Lerp(Constants.MinFlashlightRadius, Constants.MaxFlashlightRadius, Mathf.Clamp(d - Constants.MinFlashlightDistance, 0, Constants.MaxFlashlightDistance - Constants.MinFlashlightDistance) / Constants.MaxFlashlightDistance); - + var flashlightScreenPosition = flashlightScreenCenterPosition + Constants.HalfScreenSize; var flashlightScale = FlashlightRadius / Constants.MaxFlashlightRadius; Circle.Position = flashlightScreenPosition; @@ -67,20 +69,26 @@ public partial class Flashlight : Node var xy3 = a * new Vector2(Mathf.Cos(dslkhjdsflkhjsdfhlkjdfsjlk), Mathf.Sin(dslkhjdsflkhjsdfhlkjdfsjlk)); var dslkhjdsflkhjsdfhlkjdfsjlk2 = angle - arcsinRd; var xy4 = a * new Vector2(Mathf.Cos(dslkhjdsflkhjsdfhlkjdfsjlk2), Mathf.Sin(dslkhjdsflkhjsdfhlkjdfsjlk2)); - + var polygon = new[] { playerScreenPosition, playerScreenPosition + xy3, playerScreenPosition + xy4 }; Polygon.Polygon = polygon; CollisionPolygon.Polygon = polygon; } - FlashlightChargeTimeout = Mathf.Clamp(FlashlightChargeTimeout-(float)delta,0,1); - if (Input.IsActionJustPressed("flashlight_charge") && FlashlightChargeTimeout <= 0){ + FlashlightChargeTimeout = Mathf.Clamp(FlashlightChargeTimeout - (float)delta, 0, 1); + if (Input.IsActionJustPressed("flashlight_charge") && FlashlightChargeTimeout <= 0) + { FlashlightChargeTimeout = 1; - FlashlightEnergy+=Constants.FlashlightEneregyPerCharge; + FlashlightEnergy += Constants.FlashlightEneregyPerCharge; + var rng = new RandomNumberGenerator(); + CrankSoundPlayer.PitchScale = rng.RandfRange(1f, 1.15f); + CrankSoundPlayer.Play(); } - FlashlightEnergy = Mathf.Clamp(FlashlightEnergy-(float)delta, 0, Constants.MaxFlashlightEnergy); - FlashlightGroup.Modulate = new Color(BrightnessCurve.Sample(FlashlightEnergy/Constants.MaxFlashlightEnergy), 1, 1, 1); - CollisionCircle.Enabled = CollisionPlayerCircle.Enabled = CollisionPolygon.Enabled = FlashlightEnergy >= 10; + + FlashlightEnergy = Mathf.Clamp(FlashlightEnergy - (float)delta, 0, Constants.MaxFlashlightEnergy); + FlashlightGroup.Modulate = + new Color(BrightnessCurve.Sample(FlashlightEnergy / Constants.MaxFlashlightEnergy), 1, 1, 1); + CollisionCircle.Disabled = CollisionPlayerCircle.Disabled = CollisionPolygon.Disabled = FlashlightEnergy < 10; } } diff --git a/scripts/GameCamera.cs b/scripts/GameCamera.cs index 556961f..289f4b3 100644 --- a/scripts/GameCamera.cs +++ b/scripts/GameCamera.cs @@ -21,7 +21,7 @@ public partial class GameCamera : Camera2D var halfCameraFollowBounds = CameraFollowBounds / 2; var hardLimit = relativePlayerPosition.Clamp(-halfCameraBounds, halfCameraBounds); difference = relativePlayerPosition - hardLimit; - GD.Print($"HardDiff {difference}"); + //GD.Print($"HardDiff {difference}"); if (difference.IsZeroApprox()) { float x = 0, y = 0; @@ -36,7 +36,7 @@ public partial class GameCamera : Camera2D } difference = new Vector2(x, y); - GD.Print($"SmoothDiff {difference}"); + //GD.Print($"SmoothDiff {difference}"); } Position = (Position + difference).Round(); diff --git a/sounds/crank.ogg b/sounds/crank.ogg new file mode 100644 index 0000000000000000000000000000000000000000..23f6a81f59dbc53e6982a3de65146077a64ed1ec GIT binary patch literal 10224 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