2012-09-17 73 views
0

我有一個物體在屏幕上移動,一旦它到達邊緣,它就會改變方向並播放聲音,這一切都可以正常工作,除非播放聲音時我凍結了大約半秒鐘有沒有什麼方法可以使聲音和物體運動順利進行?在iOS平穩地播放聲音

-(void)viewDidLoader 
{ 
NSString *path1 = [[NSBundle mainBundle] pathForResource:@"ballbounce" ofType:@"mp3"]; 
ballbounce = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path1] error: NULL]; 
[ballbounce prepareToPlay]; 
} 

-(void) ballcollition 
{ 
[self ballplaysound] 
enemy.center = CGPointMake(enemy.center.x+pos.x,enemy.center.y+pos.y); 

    if (enemy.center.x > 328 || enemy.center.x < 0) 

    { 
     pos.x = -pos.x; 



    } 
} 
-(void)ballplaysound 
{ 
if (enemy.center.x > 328 || enemy.center.x < 0 ||enemy.center.y < 0||enemy.center.y < 300) 
[ballbounce play]; 
} 

回答

1

使用系統聲音播放流暢的聲音。

原非ARC答案:

#import <AudioToolbox/AudioToolbox.h> 

- (IBAction)soundButton:(id)sender { 

NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"alert" ofType:@"wav"]; 

SystemSoundID soundID; 

AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); 

AudioServicesPlaySystemSound (soundID); 

[soundPath release]; 

} 

更新了ARC,而變成了一個效用函數:

- (void)soundPlay:(NSString*)waveName { 
    // wavName = @"alert" without any file extension (not alert.wav) 

    NSString *soundPath = [[NSBundle mainBundle] pathForResource:waveName ofType: @"wav"]; 

    SystemSoundID soundID; 

    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); 

    AudioServicesPlaySystemSound (soundID); 


} 
+0

嘿,這工作後很多的調整,但絕對少了頭 –

+0

我更新了ARC。請注意,如果您複製粘貼原始代碼,那麼會有些奇怪的情況發生,即引用其他一些非有效的LLFM字符,這些字符很容易混淆。 –

0

您可以通過簡單地將您的mp3caf格式解釋here獲得聲音 「平滑度」 與AVPlayer

0

1)創建AVAudioPLayer並在您的應用程序初始化代碼緩存,並永遠不會調用它再次 也叫做準備。 2)所以你包含的方法應該只需要打電話;

3)如果仍然出現跳躍使用

[ballbounce performSelectorOnMainThread:@selector(play) withObject:nil]; 

既然你沒有包括所有的代碼和你都清楚地做繪圖 - 把播放方法 隊列可以讓沒有中斷繪圖代碼完成。

正確地做到這一點可能會解決您的問題。使用AudioSystemSound的開銷要低得多,但您應該遵循在應用程序初始化過程中準備任何常用聲音的相同原則,而不是在您需要它們以避免性能問題的時候產生它們。

+0

嘿@stackmoster當你談論排隊時,我該怎麼做,因爲我從來沒有做過這樣的事情? –

+0

performSelectorOnMainThread將方法自行發佈到隊列中,這可能會使圖形繪製的聲音IO不受影響。 –

+0

嗨,我已經編輯了我認爲是你提出的解決方案的代碼,但播放聲音時它仍然滯後 –