changeset 529:0ffb493a6fa4

Add support for sounds for breaking objects.
author Simon Cross <hodgestar@gmail.com>
date Sun, 10 Apr 2011 00:11:18 +0200
parents 52b38b803782
children f6bd04e5a414
files skaapsteker/sound.py skaapsteker/sprites/items.py
diffstat 2 files changed, 25 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/skaapsteker/sound.py	Sun Apr 10 00:09:20 2011 +0200
+++ b/skaapsteker/sound.py	Sun Apr 10 00:11:18 2011 +0200
@@ -5,9 +5,22 @@
 from . import data
 from .constants import FREQ, BITSIZE, CHANNELS, BUFFER
 
+_GLOBAL_SOUND = None
+
+
+def load_sound(key, track_name, volume=None):
+    if _GLOBAL_SOUND is not None:
+        _GLOBAL_SOUND.load_sound(key, track_name, volume)
+
+def play_sound(key):
+    if _GLOBAL_SOUND is not None:
+        _GLOBAL_SOUND.play_sound(key)
+
+
 class SoundSystem(object):
 
     def __init__(self, want_sound):
+        global _GLOBAL_SOUND
         if want_sound:
             # See if we can actually enabled sound
             try:
@@ -22,6 +35,7 @@
             self.sound_enabled = False
 
         self._sounds = {}
+        _GLOBAL_SOUND = self
 
 
     def play_background_music(self, track_name, volume=1.0):
@@ -37,7 +51,7 @@
         if self.sound_enabled:
             mixer.music.stop()
 
-    def load_sound(self, key, track_name):
+    def load_sound(self, key, track_name, volume=None):
         if key in self._sounds:
             # First caller wins on duplicate keys
             return
@@ -45,6 +59,8 @@
             self._sounds[key] = None
         else:
             self._sounds[key] = pygame.mixer.Sound(data.filepath(track_name))
+            if volume is not None:
+                self._sounds[key].set_volume(volume)
 
     def play_sound(self, key):
         sound = self._sounds.get(key, None)
--- a/skaapsteker/sprites/items.py	Sun Apr 10 00:09:20 2011 +0200
+++ b/skaapsteker/sprites/items.py	Sun Apr 10 00:11:18 2011 +0200
@@ -1,4 +1,4 @@
-from .. import engine, data
+from .. import engine, data, sound
 from .base import Item, PC_LAYER, PROJECTILE_LAYER
 
 import time
@@ -12,13 +12,16 @@
 class BreakableItem(Item):
     whole_image_file = None
     broken_image_file = None
+    breaking_sound = (None, None)
 
     collides_with = set([PC_LAYER, PROJECTILE_LAYER])
 
     def setup(self, broken, **opts):
         super(BreakableItem, self).setup(**opts)
         self.broken = broken
-
+        if self.breaking_sound[0] is not None:
+            track, volume = self.breaking_sound
+            sound.load_sound(track, track, volume)
 
     def setup_image_data(self, pos):
         self.image_file = self.broken_image_file if self._me.broken else self.whole_image_file
@@ -29,6 +32,8 @@
         self._me.broken = True
         self.broken = True
         self.setup_image_data(self._starting_tile_pos)
+        if self.breaking_sound[0] is not None:
+            sound.play_sound(self.breaking_sound[0])
 
     def damage(self, damage):
         self.smash()
@@ -215,6 +220,7 @@
 class Vase(BreakableItem):
     whole_image_file = 'props/vase-whole.png'
     broken_image_file = 'props/vase-broken.png'
+    breaking_sound = ('sounds/vase breaking.ogg', 0.1)
 
 
 class Salmon(Item):