DreamBall/elements/sphere.tscn

100 lines
3.3 KiB
Text
Raw Normal View History

2025-02-22 00:19:28 +01:00
[gd_scene load_steps=7 format=3 uid="uid://df5m716pd6mej"]
2025-02-21 21:47:35 +01:00
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_vumbr"]
bounce = 0.8
2025-02-22 00:19:28 +01:00
[sub_resource type="GDScript" id="GDScript_rvq6k"]
script/source = "extends RigidBody3D
var stream_players: Array[AudioStreamPlayer] = []
func makeAudioStreamPlayers(music_name: String):
var path: String = \"res://music/\" + music_name
var dir: DirAccess = DirAccess.open(path)
var file_paths: Array[String] = []
assert(dir, path + \" is not a valid path!\")
if dir:
dir.list_dir_begin()
var file_name = dir.get_next()
while file_name != \"\":
if !dir.current_is_dir():
if file_name.ends_with(\".ogg\"):
file_paths.push_back(path + \"/\" + file_name)
file_name = dir.get_next()
assert(len(file_paths), path + \" had no .ogg files!\")
var players: Array[AudioStreamPlayer] = []
for file_path in file_paths:
var stream: AudioStreamOggVorbis = AudioStreamOggVorbis.load_from_file(file_path)
stream.loop = true
stream.bpm = 124
var player: AudioStreamPlayer = AudioStreamPlayer.new()
player.name = file_path.substr(10)
player.stream = stream
player.volume_db = -50
players.push_back(player)
add_child(player)
stream_players = players
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
makeAudioStreamPlayers(\"base\")
for player in stream_players:
player.play()
func handleMusicWithVelocity(velocity: float, delta: float) -> void:
var instruments_needed = floor(velocity / 10)
var instruments_playing = stream_players.filter(func(p: AudioStreamPlayer): return p.volume_db > -50)
for index_p in len(instruments_playing):
var playing = instruments_playing[index_p]
if index_p + 1 > instruments_needed:
playing.volume_db -= delta * 32
elif playing.volume_db <= 0:
playing.volume_db += delta * 8
if instruments_needed > len(instruments_playing):
var instruments_not_playing = stream_players.filter(func(p: AudioStreamPlayer): return p.volume_db <= -50)
if len(instruments_not_playing):
var to_play = instruments_not_playing.pick_random()
if is_instance_valid(to_play):
to_play.volume_db += delta * 16
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
for player in stream_players:
if player.volume_db > 0:
player.volume_db = 0
var velocity: float = abs(self.linear_velocity.x) + abs(self.linear_velocity.y)
handleMusicWithVelocity(velocity, delta)
"
2025-02-21 21:47:35 +01:00
[sub_resource type="SphereShape3D" id="SphereShape3D_xfgrm"]
2025-02-22 00:19:28 +01:00
[sub_resource type="Gradient" id="Gradient_ggbpc"]
colors = PackedColorArray(0.979416, 0, 0.376508, 1, 0, 0.583757, 0.65245, 1)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_vxsyc"]
gradient = SubResource("Gradient_ggbpc")
fill_from = Vector2(0.490476, 0)
fill_to = Vector2(0.504762, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_14eku"]
albedo_texture = SubResource("GradientTexture2D_vxsyc")
2025-02-21 21:47:35 +01:00
[node name="Sphere" type="RigidBody3D"]
axis_lock_linear_z = true
physics_material_override = SubResource("PhysicsMaterial_vumbr")
2025-02-22 00:19:28 +01:00
script = SubResource("GDScript_rvq6k")
2025-02-21 21:47:35 +01:00
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("SphereShape3D_xfgrm")
[node name="CSGSphere3D" type="CSGSphere3D" parent="."]
radial_segments = 20
rings = 10
2025-02-22 00:19:28 +01:00
material = SubResource("StandardMaterial3D_14eku")