generated from krampus/template-godot4
Stochastic model for grunk collection SFX
This commit is contained in:
parent
065b9521b6
commit
e25bede7f6
@ -1,11 +1,15 @@
|
||||
extends AudioStreamPlayer
|
||||
|
||||
@export var max_meter := 1000.0
|
||||
@export var epsilon := 20.0
|
||||
@export var decay_rate := 0.95
|
||||
@export var interval_curve: Curve
|
||||
@export var interval := 200.0
|
||||
|
||||
var _meter := 0.0
|
||||
@export var max_delta := 2000.0
|
||||
|
||||
@export var delay_mean := 0.7
|
||||
@export var delay_st_dev := 0.1
|
||||
|
||||
@export var counter_decay := 40.0
|
||||
|
||||
var _counter := 0.0
|
||||
|
||||
@onready var cooldown: Timer = %Cooldown
|
||||
@onready var debug_meter: ProgressBar = %DebugMeter
|
||||
@ -16,27 +20,16 @@ func _ready() -> void:
|
||||
World.instance.manager.grunk_collected.connect(on_grunk_collected)
|
||||
|
||||
|
||||
func trigger() -> void:
|
||||
play()
|
||||
if _meter > epsilon:
|
||||
restart_interval()
|
||||
|
||||
|
||||
func restart_interval() -> void:
|
||||
var interval := interval_curve.sample(_meter)
|
||||
print_debug("meter: ", _meter, "; interval: ", interval)
|
||||
cooldown.start(interval)
|
||||
|
||||
|
||||
func on_grunk_collected(delta: float) -> void:
|
||||
var old_meter := _meter
|
||||
_meter = clampf(_meter + delta, epsilon, max_meter)
|
||||
|
||||
if old_meter <= epsilon:
|
||||
trigger()
|
||||
delta = min(delta, max_delta)
|
||||
while delta > _counter:
|
||||
delta -= _counter
|
||||
_counter = interval
|
||||
var delay := randfn(delay_mean, delay_st_dev)
|
||||
get_tree().create_timer(delay).timeout.connect(play)
|
||||
print_debug("Playing collect sfx in: ", delay)
|
||||
_counter -= delta
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
var weight := 1 - exp(-decay_rate * delta)
|
||||
_meter = lerpf(_meter, 0.0, weight)
|
||||
debug_meter.value = _meter
|
||||
_counter = move_toward(_counter, 0.0, counter_decay * delta)
|
||||
|
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=8 format=3 uid="uid://cbtmhu787diev"]
|
||||
[gd_scene load_steps=7 format=3 uid="uid://cbtmhu787diev"]
|
||||
|
||||
[ext_resource type="AudioStream" uid="uid://dxstv7gr5n2yg" path="res://assets/sfx/tools/collect1.wav" id="1_h705l"]
|
||||
[ext_resource type="AudioStream" uid="uid://b4prjqpwjpv7p" path="res://assets/sfx/tools/collect2.wav" id="2_uq3q4"]
|
||||
@ -14,36 +14,14 @@ stream_1/stream = ExtResource("2_uq3q4")
|
||||
stream_2/stream = ExtResource("3_h5hmg")
|
||||
stream_3/stream = ExtResource("4_8ycea")
|
||||
|
||||
[sub_resource type="Curve" id="Curve_h705l"]
|
||||
_limits = [0.0, 1.0, 0.0, 1000.0]
|
||||
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(580.268, 0.0565841), 0.0, 0.0, 0, 0]
|
||||
point_count = 2
|
||||
|
||||
[node name="GrunkCollectionSFX" type="AudioStreamPlayer"]
|
||||
stream = SubResource("AudioStreamRandomizer_bgxyk")
|
||||
volume_db = -4.0
|
||||
max_polyphony = 4
|
||||
script = ExtResource("5_ihwko")
|
||||
epsilon = 100.0
|
||||
decay_rate = 0.99
|
||||
interval_curve = SubResource("Curve_h705l")
|
||||
|
||||
[node name="Cooldown" type="Timer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
wait_time = 0.12
|
||||
one_shot = true
|
||||
|
||||
[node name="CanvasLayer" type="CanvasLayer" parent="."]
|
||||
|
||||
[node name="DebugMeter" type="ProgressBar" parent="CanvasLayer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(300, 0)
|
||||
anchors_preset = 2
|
||||
anchor_top = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_top = -27.0
|
||||
offset_right = 4.0
|
||||
grow_vertical = 0
|
||||
max_value = 1000.0
|
||||
|
||||
[connection signal="timeout" from="Cooldown" to="." method="trigger"]
|
||||
|
Loading…
x
Reference in New Issue
Block a user