Compare commits

...

2 Commits

Author SHA1 Message Date
Storm Dragon
0c73e98876 Improved sound while walking on left/right only. 2024-07-05 17:24:23 -04:00
Storm Dragon
0ef11785ec Revert "A new try at sound panning with walking."
This reverts commit 58ab5aa854.
2024-07-05 17:04:12 -04:00

View File

@ -173,42 +173,48 @@ def cut_scene(sounds, soundName):
pygame.mixer.stop() pygame.mixer.stop()
pygame.event.pump() pygame.event.pump()
def obj_play(sounds, sound_name, player_pos, obj_pos):
distance = player_pos - obj_pos def calculate_volume_and_pan(player_pos, obj_pos):
if abs(distance) > 9: distance = abs(player_pos - obj_pos)
# The item is out of range, so play it at 0 max_distance = 12 # Maximum audible distance
left = 0 if distance > max_distance:
right = 0 return 0, 0, 0 # No sound if out of range
# Calculate volume (non-linear scaling for more noticeable changes)
volume = ((max_distance - distance) / max_distance) ** 1.5
# Determine left/right based on relative position
if player_pos < obj_pos:
# Object is to the right
left = max(0, 1 - (obj_pos - player_pos) / max_distance)
right = 1
elif player_pos > obj_pos:
# Object is to the left
left = 1
right = max(0, 1 - (player_pos - obj_pos) / max_distance)
else: else:
# Calculate the panning based on the distance # Player is on the object
left = max(0, 1 - (distance / 9)) left = right = 1
right = max(0, 1 + (distance / 9)) return volume, left, right
left = min(1, left)
right = min(1, right) def obj_play(sounds, soundName, player_pos, obj_pos):
volume, left, right = calculate_volume_and_pan(player_pos, obj_pos)
if volume == 0:
return None # Don't play if out of range
# Play the sound on a new channel # Play the sound on a new channel
channel = sounds[sound_name].play(-1) x = sounds[soundName].play(-1)
# Apply the position information to the channel # Apply the volume and pan
channel.set_volume(left, right) x.set_volume(volume * left, volume * right)
# Return the channel so that it can be used in the update and stop functions. return x
return channel def obj_update(x, player_pos, obj_pos):
if x is None:
def obj_update(channel, player_pos, obj_pos): return None
distance = player_pos - obj_pos volume, left, right = calculate_volume_and_pan(player_pos, obj_pos)
if abs(distance) > 9: if volume == 0:
left = 0 x.stop()
right = 0 return None
else: # Apply the volume and pan
# Calculate the panning based on the distance x.set_volume(volume * left, volume * right)
left = max(0, 1 - (distance / 9)) return x
right = max(0, 1 + (distance / 9))
left = min(1, left)
right = min(1, right)
# Apply the position information to the channel
channel.set_volume(left, right)
# Return the channel
return channel
soundData
def obj_stop(x): def obj_stop(x):
# Tries to stop a playing object channel # Tries to stop a playing object channel
try: try: