2014-04-18 22 views
0

这是一个精灵类,它在屏幕上左右移动,当它碰到边界时,它会发出“砰砰”的声音并走向相反的方向,一切工作完全正常,除了没有嘣的声音,当它击中边如何在类中定义和播放声音效果

class MySprite(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 

     self.image = pygame.image.load("vegetables.gif") 
     self.image = self.image.convert() 

     self.rect = self.image.get_rect() 
     self.rect.left = 0 
     self.rect.top = 167 
     self.__direction = 10 


    def update(self): 
     self.rect.left += self.__direction 
     sound = pygame.mixer.Sound("Bounce.mp3") 
     sound.set_volume(0.5) 
     if (self.rect.left < 0) or (self.rect.right > screen.get_width()):   
      sound.play() 
      self.__direction = -self.__direction 
+0

你说有一种沉闷的声音,然后你说没有?请更具体地了解正在发生的事情的顺序。声音是否发生过一次,但没有发生过?它是否始终发生在某些边缘而不是其他边缘? – bdesham

+0

对于初学者来说,将声音加载到'__init__'中,而不是每一帧加载到'update'中。 – kevintodisco

+0

@bdesham我的意思是说boing应该发生,但它不起作用,现在没有boing –

回答

2

如果你想在课堂上播放自己的声音,只是加载它像__init__任何属性。

class MySprite(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 

     self.image = pygame.image.load("vegetables.gif") 
     self.image = self.image.convert() 
     self.sound = pygame.mixer.Sound("Bounce.mp3") #like this 
     self.rect = self.image.get_rect() 
     self.rect.left = 0 
     self.rect.top = 167 
     self.__direction = 10 

然后,只要它是正确的,只需拨打self.sound.play()即可。

def update(self): 
     self.rect.left += self.__direction 
     if (self.rect.left < 0) or (self.rect.right > screen.get_width()):   
      self.sound.play()     #as seen here 
      self.__direction = -self.__direction 

不管它是值得的 - 如果你打算做这样(有精灵发挥自己的声音,等等),我会建议先加载它们,然后将它们作为参数(也许是默认参数以避免错误),这样,如果需要,每个类的实例都可以调用唯一的声音。

在你的代码

所以以前这些类,我们可以这样做:

JumpSound = pygame.Mixer.Sound("jump.wav") 
BonkSound = pygame.Mixer.Sound("bonk.wav") 
#etc etc etc... 

...再后来,通过声音作为参数:

class MySprite(pygame.sprite.Sprite): 
    def __init__(self, jumpsound, bonksound): 
     #...your other code precedes... 
     self.jumpsound = jumpsound 
     self.bonksound = bonksound 
     #...your other code continues... 

myHero = MySprite(JumpSound, BonkSound) 

的名字有点糟糕,除了CamelCasing之外,它们是一样的,但忘记了这可能是一种更简洁的方法。您可以在声音传递到精灵之前将声音设置为声音方式,以及在精灵获取它们之前需要进行的其他所有必要的更改。

+0

,但它给出了一个错误... AttributeError:'MySprite'对象没有属性'sound' –

+0

也许将编辑的当前状态发布到OP?也许还有另一种错误 –