我正在尝试使用应用程序的人在屏幕上拖动他/她的手指时应该播放一个简短的声音样本的应用程序。当手指抬离屏幕时 - 声音会停止。
这是触发声音的当前函数(我尝试了各种方法):
-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
NSLog(@"Ja, den börjar...");
return YES;
}
-(void)ccTouchMoved:(NSSet *)touch withEvent:(UIEvent *)event{
soundFile = [[CDAudioManager sharedManager] audioSourceForChannel:kASC_Right];
[soundFile load:@"sound.wav"];
soundFile.backgroundMusic = NO;
soundSourceForFile:@"sound.wav"]retain];
}
这是停止声音的功能:
-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event{
[soundFile stop];
}
我首先开始使用ccTouchBegan(只是为了获得某种声音效果),它可以无缝地循环声音。此时,ccTouchEnded与“Touch Up Inside”活动一起工作。
正如我所说的那样,当用户在屏幕上拖动他/她的手指时,应该播放声音。但是当我试图将playSound函数绑定到“ccTouchMoved”时,声音会反复循环,而不是当时的声音,这使得它可以使用。更改为ccTouchMoved后,stopSound函数不起作用。
我尝试使用NSTimer来创建某种处理循环的方法,但没有任何成功。
我使用常规的iOS SDK启动了这个项目,当我发现我无法处理音调时,发现了我的局限性。在没有Cocos2d的情况下获得操控。
我将常规SDK中的所有内容都包含在if语句中:
if(![mySound isPlaying]{
[mySound play];
}
正如我所说,这在常规SDK中运行得非常好,但现在当我使用Cocos2d时没有。
你们有什么好主意吗?对于Objective-C,iPhone开发和我来说,我是初学者。 XCode - 和我一起裸露。
答案 0 :(得分:1)
当手指沿着屏幕移动时,将连续调用ccTouchMoved。你在这里遇到的问题是每次调用它时你都会加载一个新的声音文件并且它们是重叠的,因为它们是新创建的单个对象。你只能引用你加载的最终声音(这是soundFile指向的声音)并且你也没有释放内存。
示例:
(当你拖动手指时)
LoadedSoundA created and starts playing
soundfile points to LoadedSoundA
// finger moves
LoadedSoundB created and starts playing
soundfile points to LoadedSoundB
// finger moves
LoadedSoundC created and starts playing
soundfile points to LoadedSoundC
... etc
此刻您指针的唯一声音是最后创建的声音,因为您每次都会重新分配声音文件。所以你只能“停止”你最后创造的声音。
由于您保留了所有这些声音并且从未释放它们,因此您也会泄漏大量内存。
我建议采用不同的策略:
在touchesBegan中你应该加载声音并让它在循环播放并将触摸时间记录到一个级别的iVar中。
现在,在TouchesMoved中,您应该获得当前触摸的时间,并查看它是否足够接近您录制的时间。如果它在0.5秒内,那么只需更新记录的时间戳并继续;但是,如果距离上次触摸时间过长,则会停止正在播放的声音。
通过这种方式,您可以播放无缝声音,只创建一次并保持对其的所有权。
希望这有帮助