Compare commits
3 Commits
658709ebce
...
80fe2caff3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80fe2caff3 | ||
|
|
2df86c9c76 | ||
|
|
5fa90f9e84 |
65
__init__.py
65
__init__.py
@@ -310,15 +310,29 @@ def calculate_volume_and_pan(player_pos, obj_pos):
|
||||
left = right = 1
|
||||
return volume, left, right
|
||||
|
||||
def obj_play(sounds, soundName, player_pos, obj_pos):
|
||||
def obj_play(sounds, soundName, player_pos, obj_pos, loop=True):
|
||||
"""Play a sound with positional audio.
|
||||
|
||||
Args:
|
||||
sounds: Dictionary of sound objects
|
||||
soundName: Name of sound to play
|
||||
player_pos: Player's position for audio panning
|
||||
obj_pos: Object's position for audio panning
|
||||
loop: Whether to loop the sound (default True)
|
||||
|
||||
Returns:
|
||||
The sound channel object, or None if out of range
|
||||
"""
|
||||
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
|
||||
x = sounds[soundName].play(-1)
|
||||
x = sounds[soundName].play(-1 if loop else 0) # -1 for loop, 0 for once
|
||||
# Apply the volume and pan
|
||||
x.set_volume(volume * left, volume * right)
|
||||
if x:
|
||||
x.set_volume(volume * left, volume * right)
|
||||
return x
|
||||
|
||||
def obj_update(x, player_pos, obj_pos):
|
||||
if x is None:
|
||||
return None
|
||||
@@ -395,8 +409,8 @@ def play_random_positional(sounds, soundName, playerX, objectX):
|
||||
channel.set_volume(volume * left, volume * right)
|
||||
return channel
|
||||
|
||||
def play_random_falling(sounds, soundName, playerX, objectX, startY, currentY=0, maxY=20):
|
||||
"""Play a random sound with positional audio that increases in volume as it 'falls'.
|
||||
def play_random_falling(sounds, soundName, playerX, objectX, startY, currentY=0, maxY=20, existingChannel=None):
|
||||
"""Play or update a random sound with positional audio that increases in volume as it 'falls'.
|
||||
|
||||
Args:
|
||||
sounds: Dictionary of sound objects
|
||||
@@ -406,27 +420,42 @@ def play_random_falling(sounds, soundName, playerX, objectX, startY, currentY=0,
|
||||
startY: Starting Y position (0-20, higher = quieter start)
|
||||
currentY: Current Y position (0 = ground level)
|
||||
maxY: Maximum Y value (default 20)
|
||||
existingChannel: Existing sound channel to update instead of creating new one (default None)
|
||||
|
||||
Returns:
|
||||
The sound channel object for updating position/volume
|
||||
The sound channel object for updating position/volume, or None if sound should stop
|
||||
"""
|
||||
keys = [k for k in sounds.keys() if k.startswith(soundName)]
|
||||
if not keys:
|
||||
return None
|
||||
|
||||
randomKey = random.choice(keys)
|
||||
# Calculate horizontal positioning
|
||||
volume, left, right = calculate_volume_and_pan(playerX, objectX)
|
||||
if volume == 0:
|
||||
return None
|
||||
|
||||
|
||||
# Calculate vertical fall volume multiplier (0 at maxY, 1 at y=0)
|
||||
fallMultiplier = 1 - (currentY / maxY)
|
||||
|
||||
channel = sounds[randomKey].play()
|
||||
if channel:
|
||||
channel.set_volume(volume * left * fallMultiplier, volume * right * fallMultiplier)
|
||||
return channel
|
||||
# Adjust final volumes
|
||||
finalVolume = volume * fallMultiplier
|
||||
finalLeft = left * finalVolume
|
||||
finalRight = right * finalVolume
|
||||
|
||||
if existingChannel is not None:
|
||||
if volume == 0: # Out of audible range
|
||||
existingChannel.stop()
|
||||
return None
|
||||
existingChannel.set_volume(finalLeft, finalRight)
|
||||
return existingChannel
|
||||
else: # Need to create new channel
|
||||
if volume == 0: # Don't start if out of range
|
||||
return None
|
||||
|
||||
# Find matching sound files
|
||||
keys = [k for k in sounds.keys() if k.startswith(soundName)]
|
||||
if not keys:
|
||||
return None
|
||||
|
||||
randomKey = random.choice(keys)
|
||||
channel = sounds[randomKey].play()
|
||||
if channel:
|
||||
channel.set_volume(finalLeft, finalRight)
|
||||
return channel
|
||||
|
||||
def instructions():
|
||||
# Read in the instructions file
|
||||
|
||||
Reference in New Issue
Block a user