2014-05-16 58 views
2

我有幾個級別都使用相同的聲音效果。我沒有在每個級別上使用相同的代碼,而是將所有聲音合併到一個單例類中。然而,當我從其他類運行該方法時,將它放入單例中不會播放聲音。我沒有錯誤或警告。SKAction playSoundFileNamed從Singleton

當我在每個班級有相同的代碼時,播放聲音沒有任何問題。

問:是否SKAction playSoundFileNamed不是從一個單身叫或我的代碼失去了一些東西的時候工作?

我的單頭文件...

-(void)soundSwordWhoosh; 

我的單態方法文件...

@implementation Animations{ 
    SKAction *swordWhooshSound; 
} 

-(id)init { 
    self = [super init]; 
    if (self) 
    { 
     swordWhooshSound = [SKAction playSoundFileNamed:@"SwordWhoosh.mp3" waitForCompletion:YES]; 
    } 
return self; 
} 

-(void)soundSwordWhoosh { 
[self runAction:swordWhooshSound]; 
} 

我然後調用該方法是這樣的:

[_animations soundSwordWhoosh]; 

回答

7

你是單身可能不在節點層次結構中(即不是該場景的子節點或孫子節點等)。因此,您不能在self上運行任何操作,因爲單例實例不會從Sprite Kit收到定期更新。

這裏也沒有必要使用單例,因爲使用類方法可以更輕鬆地做同樣的事情。你只需要傳入聲音應該播放的節點。

下面是一個例子輔助類:

@interface SoundHelper 
+(void) playSwordSoundWithNode:(SKNode*)node; 
@end 

@implementation SoundHelper 
+(void) playSwordSoundWithNode:(SKNode*)node 
{ 
    [node runAction:[SKAction playSoundFileNamed:@"SwordWhoosh.mp3" waitForCompletion:YES]]; 
} 
@end 

如果你擔心「高速緩存」不值得這樣做的動作。你會做很多其他影響性能的事情。除了Sprite Kit內部創建的每一個動作的副本,無論你是創建一個新的還是Sprite Kit拷貝它都不會有太大的改變。如果你願意,你仍然可以將它緩存在static變量中。

您可以從任何節點和任何方法輔助方法,像這樣(不要忘記#import "SoundHelper.h"):

-(void) someNodeMethod 
{ 
    [SoundHelper playSwordSoundWithNode:self]; 
} 

PS:你不應該使用.mp3文件的聲音效果,因爲它是效率很低。 iOS硬件只能通過硬件一次解碼一個mp3,其餘部分由CPU完成。 。較短的聲音效果更適合的格式是.caf和.wav。

+2

太棒了。完美工作,並特別感謝在mp3問題上的負責人。我並不知道這個限制。 Dankeschön! – sangony