Mercurial > nagslang
changeset 269:9fcdb106424a
Add first draft of sound support.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Thu, 05 Sep 2013 00:54:26 +0200 |
parents | dda7689a3e87 |
children | cb6d03012053 |
files | nagslang/__main__.py nagslang/constants.py nagslang/screens/area.py nagslang/sound.py |
diffstat | 4 files changed, 96 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/nagslang/__main__.py Thu Sep 05 00:53:57 2013 +0200 +++ b/nagslang/__main__.py Thu Sep 05 00:54:26 2013 +0200 @@ -6,6 +6,7 @@ from nagslang.options import parse_args from nagslang.constants import SCREEN from nagslang.engine import Engine +from nagslang.sound import sound def main(): @@ -16,6 +17,7 @@ pygame.display.set_mode(SCREEN, pgl.SWSURFACE | pgl.RESIZABLE) #pygame.display.set_icon(load_image(...)) pygame.display.set_caption('Nagslang') + sound.init() screen = pygame.display.get_surface() engine = Engine(screen)
--- a/nagslang/constants.py Thu Sep 05 00:53:57 2013 +0200 +++ b/nagslang/constants.py Thu Sep 05 00:54:26 2013 +0200 @@ -8,6 +8,12 @@ sound=True, ) +# Sound constants +FREQ = 44100 # same as audio CD +BITSIZE = -16 # unsigned 16 bit +CHANNELS = 2 # 1 == mono, 2 == stereo +BUFFER = 1024 # audio buffer size in no. of samples + COLLISION_TYPE_OTHER = 0 COLLISION_TYPE_PLAYER = 1 COLLISION_TYPE_WALL = 2
--- a/nagslang/screens/area.py Thu Sep 05 00:53:57 2013 +0200 +++ b/nagslang/screens/area.py Thu Sep 05 00:54:26 2013 +0200 @@ -10,6 +10,7 @@ from nagslang.protagonist import Protagonist from nagslang.screens.base import Screen from nagslang.game_object import Bullet +from nagslang.sound import sound class ControlKeys(object): @@ -81,6 +82,7 @@ else: self.add_protagonist() self.add_game_objects() + sound.play_music("POL-cyber-factory-short.ogg") def _collision_pre_solve_handler(self, space, arbiter): gobj = arbiter.shapes[1].physicser.game_object
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nagslang/sound.py Thu Sep 05 00:54:26 2013 +0200 @@ -0,0 +1,86 @@ +"""Sound utilities.""" + +from pygame import mixer + +from nagslang.options import options +from nagslang.resources import resources +from nagslang.constants import FREQ, BITSIZE, CHANNELS, BUFFER + + +class DummySound(object): + def init(self): + pass + + def play_sound(self, name, volume=None): + pass + + def play_music(self, name, volume=None): + pass + + def pause_music(self): + pass + + def resume_music(self): + pass + + def stop(self): + pass + + +class PygameSound(object): + def __init__(self): + self._sounds = {} + + def init(self): + mixer.init(FREQ, BITSIZE, CHANNELS, BUFFER) + self.play_sound("silence.ogg") + + def load_sound(self, name): + track_name = resources.get_resource_path("sounds", name) + sound = self._sounds.get(track_name) + if sound is None: + sound = self._sounds[track_name] = mixer.Sound(track_name) + return sound + + def play_sound(self, name, volume=1.0): + sound = self.load_sound(name) + if sound is not None: + sound.set_volume(volume) + sound.play() + + def play_music(self, name, volume=1.0): + track_name = resources.get_resource_path("music", name) + mixer.music.load(track_name) + mixer.music.set_volume(volume) + mixer.music.play(-1) # loop sound + + def pause_music(self): + mixer.music.pause() + + def unpause_music(self): + mixer.music.unpause() + + def stop(self): + mixer.stop() + mixer.music.stop() + + +class SoundProxy(object): + def __init__(self): + self._sound = DummySound() + + def init(self): + """Attempt to initialize the sound system.""" + if options.sound: + try: + pyg_sound = PygameSound() + pyg_sound.init() + self._sound = pyg_sound + except Exception, err: + print "Failed to enable sound: %r" % (err,) + + def __getattr__(self, name): + return getattr(self._sound, name) + + +sound = SoundProxy()