2012-09-17 75 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

嗨,我已经编辑了我认为是你提出的解决方案的代码,但播放声音时它仍然滞后 –