2008-11-13 50 views
5

我已經在我的Mac編寫的廉價&歡快的音板的NSSound對象,我玩的各種聲音與NSSound這樣的:如何褪色

-(void)play:(NSSound *)soundEffect:(BOOL)stopIfPlaying { 
    BOOL wasPlaying = FALSE; 

    if([nowPlaying isPlaying]) { 
     [nowPlaying stop]; 
     wasPlaying = TRUE; 
    } 

    if(soundEffect != nowPlaying) 
    { 
     [soundEffect play]; 
     nowPlaying = soundEffect; 
    } else if(soundEffect == nowPlaying && ![nowPlaying isPlaying] && !wasPlaying) { 
     [nowPlaying play]; 
    } 
} 

而不是隻是阻止它死了,我想讓它在幾秒鐘內消失。

回答

1

這是該方法的最終版本:

-(void)play:(NSSound *)soundEffect:(BOOL)stopIfPlaying { 
    BOOL wasPlaying = FALSE; 

    if([nowPlaying isPlaying]) { 
     struct timespec ts; 
     ts.tv_sec = 0; 
     ts.tv_nsec = 25000000; 

     // If the sound effect is the same, fade it out. 
     if(soundEffect == nowPlaying) 
     { 
      for(int i = 1; i < 30; ++i) 
      { 
       [nowPlaying setVolume: (1.0/i)]; 
       nanosleep(&ts, &ts); 
      }   
     } 

     [nowPlaying stop]; 
     [nowPlaying setVolume:1]; 
     wasPlaying = TRUE; 
    } 

    if(soundEffect != nowPlaying) 
    { 
     [soundEffect play]; 
     nowPlaying = soundEffect; 
    } else if(soundEffect == nowPlaying && ![nowPlaying isPlaying] && !wasPlaying) { 
     [nowPlaying play]; 
    } 
} 

所以只有淡出如果我通過了同樣的聲音(即點擊相同的按鈕),另外,我去了nanosleep而不是睡眠,因爲它具有1秒的粒度。

我掙扎試圖找出爲什麼我的200毫秒的延遲似乎沒有任何作用了一段時間,但隨後200納秒是不是真的那麼長時間了:-)

0

像這樣的事情吧?你可能需要一個更線性的空投,但其基本思想是讓循環和睡眠的時間,直到下一個更新週期。

if([nowPlaying isPlaying]) { 
    for(int i = 1; i < 100; ++i) 
    { 
     [nowPlaying setVolume: (1.0/i)]; 
     Sleep(20); 
    } 
    [nowPlaying stop]; 
    wasPlaying = TRUE; 
} 
+0

我只是嘗試這樣做克里斯,睡眠功能把整個筆記本電腦睡覺,這讓我竊喜。 睡眠正常工作,但它發生在秒,而不是毫秒的參數。 – 2008-11-15 15:43:48

+0

詛咒你犯錯誤的shift鍵! – 2008-11-17 22:09:31

1

我會使用的NSTimer避免阻塞主線程。