feat: sound
- add SoundManager class to handle bgm and sfx - add script to generate wav sound assets - integrate sfx for shop purchases and player transform - add dynamic bgm switching based on player state - add sound file paths and volume configurations to settings
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
import wave, struct, math, os, random
|
||||
|
||||
"""
|
||||
run once to get sounds generated - KI helped here to do this!
|
||||
"""
|
||||
|
||||
SOUND_DIR = "../assets/sounds"
|
||||
|
||||
def save_wav(filename, data):
|
||||
if not os.path.exists(SOUND_DIR):
|
||||
os.makedirs(SOUND_DIR)
|
||||
|
||||
path = os.path.join(SOUND_DIR, filename)
|
||||
|
||||
with wave.open(path, 'w') as f:
|
||||
f.setnchannels(1)
|
||||
f.setsampwidth(2)
|
||||
f.setframerate(44100)
|
||||
for s in data:
|
||||
# Den Soundwert in das richtige Format (16-bit PCM) umwandeln
|
||||
f.writeframesraw(struct.pack('<h', int(s * 32767)))
|
||||
|
||||
def gen(dur, func, vol=0.4):
|
||||
num_samples = int(dur * 44100)
|
||||
return [func(i/44100, i) * vol * min(1.0, (num_samples-i)/(4410*dur)) for i in range(num_samples)]
|
||||
|
||||
print(f"Das Skript liegt in 'src', speichert aber nach: {os.path.abspath(SOUND_DIR)}")
|
||||
|
||||
save_wav("bgm_normal.wav", gen(10.0, lambda t, i: (math.sin(2*math.pi*110*t) + math.sin(2*math.pi*440*t)*0.2)/2, 0.2))
|
||||
save_wav("bgm_creepy.wav", gen(10.0, lambda t, i: math.sin(2*math.pi*(60+5*math.sin(t))*t), 0.2))
|
||||
save_wav("tower_shoot.wav", gen(0.15, lambda t, i: 1.0 if math.sin(2*math.pi*1200*(1-t*5)*t) > 0 else -1.0, 0.1))
|
||||
save_wav("monster_hit.wav", gen(0.1, lambda t, i: random.uniform(-1, 1), 0.3))
|
||||
save_wav("buy_success.wav", gen(0.3, lambda t, i: math.sin(2*math.pi*(660 if t<0.1 else 880)*t)))
|
||||
save_wav("buy_fail.wav", gen(0.4, lambda t, i: math.sin(2*math.pi*120*t) * (1+math.sin(40*t))))
|
||||
save_wav("monster_healed.wav", gen(0.8, lambda t, i: math.sin(2*math.pi*(440+800*t**2)*t)))
|
||||
save_wav("monster_transform.wav", gen(1.2, lambda t, i: math.sin(2*math.pi*(200-150*t)*t) * random.uniform(0.5, 1.0)))
|
||||
|
||||
print("Fertig! Schau jetzt in deinem Hauptverzeichnis unter assets/sounds nach.")
|
||||
Reference in New Issue
Block a user