2011-10-10 44 views
0

我想在那裏做短暫聲音樣本應該在使用應用軟件的人是拖他/她的手指(S)跨時播放的應用屏幕。當手指離開屏幕時 - 聲音將停止。的Cocos2D - ccTouchMoved觸發聲音反覆與ccTouchEnded不起作用

這是觸發聲音的當前功能(我已經試過各種方法):

-(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的節奏&增益操作。

我把一切都通過在if語句包裹它在常規SDK工作:

if(![mySound isPlaying]{ 
    [mySound play]; 
} 

這一點,正如我所說,在常規工作SDK完全正常,但不是現在,當我使用Cocos2D中。

你們有什麼好主意嗎?當談到Objective-C時,我是一名初學者,iPhone開發& XCode - 對我來說很裸露。

回答

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您應該加載的聲音,並讓它在循環播放和錄製觸摸的時間爲一流水平伊娃。

現在,在TouchesMoved中,您應該獲得當前觸摸的時間,並查看它是否足夠接近您記錄的時間。如果它在0.5秒內,則更新記錄的時間戳並繼續;但是,如果從最後一次觸摸開始太長時間,您會停止正在播放的聲音。

這樣你就可以播放無縫的聲音,它只會被創建一次,並保持對它的所有權。

希望這可以幫助

+0

我真的覺得你指着我在正確的方向。我已經完成了上面所建議的幾乎所有事情,預載聲音並開始播放。你想幫助醫學一些關於ccTime函數的語法嗎?我在寫什麼的時候會遇到一些麻煩。 只是想澄清 - 當我觸摸背景時,我不想讓聲音播放。我只想讓它在我的手指在屏幕上移動的時候播放,然後在我將它們擡起時停下來。 感謝您抽出時間。 – user978679