能有人FMOD體驗,請從失去它阻止我。我無法獲得這些同步點的行爲。我有一些遊戲音樂,包括兩部分,一個介紹和一個循環。它們是獨立的聲音,並且在介紹結束之後,它開始循環部分,該部分永遠重複。我在介紹結尾處設置了一個同步點以啓動循環。它工作得很好,直到我嘗試停止並重新開始音樂(例如播放器死亡時)。不管如何,同步點堅持只要前奏重啓射擊,即使它設置爲前奏的結束。結果是,兩部分音樂都在同時播放,並且在單個頻道上播放,因爲我告訴它重新使用頻道。這甚至有可能嗎?下面是一些我的代碼(注意,系統介紹,循環,和渠道是成員變量):FMOD聲音庫 - 同步點使我瘋狂!
public void Play()
{
if (intro != null)
{
CHANNELINDEX index = (channel == null) ? CHANNELINDEX.FREE : CHANNELINDEX.REUSE;
system.playSound(index, intro, false, ref channel);
uint length = 0;
intro.getLength(ref length, TIMEUNIT.MS);
intro.addSyncPoint(length, TIMEUNIT.MS, "StartLoop", ref loopPtr);
channel.setCallback(callback);
}
else system.playSound(CHANNELINDEX.FREE, loop, false, ref channel);
Playing = true;
}
而這裏的同步點:
private FMOD.RESULT SyncCallback(IntPtr c, CHANNEL_CALLBACKTYPE type, IntPtr a, IntPtr b)
{
if (Playing)
{
RESULT result = intro.getSyncPoint(0, ref loopPtr);
intro.deleteSyncPoint(loopPtr);
system.playSound(CHANNELINDEX.REUSE, loop, false, ref channel);
}
return RESULT.OK;
}
至少,這是回調的一個版本。我已經嘗試了約20個人。注意我正在告訴它刪除同步點 - 當我檢查了返回時,它是確定的。我試過一個loop.deleteSyncPoint以防萬一。我也做了一個getsyncpointinfo,以確保它是我的StartLoop同步點擊。然而,它仍然火災時發揮被再次調用,調用後停止:
public void Stop()
{
Playing = false;
if (intro != null && loopPtr != IntPtr.Zero)
{
IntPtr ptr = IntPtr.Zero;
RESULT result = intro.getSyncPoint(0, ref ptr);
result = intro.deleteSyncPoint(ptr);
result = intro.getSyncPoint(0, ref ptr);
loopPtr = IntPtr.Zero;
}
channel.stop();
channel.setPosition(0, TIMEUNIT.MS);
}
注意,停止()也試圖刪除同步點,但它沒有這樣做,以及(即使結果回來好)。我試圖在停止時將通道位置設置爲0,這使情況變得更糟。我試圖channel.stop()在我的同步點deletesyncpoint()調用後,然而,導致堆棧溢出,因爲它一直呼籲每個呼叫的同步點停止,儘管試圖將其刪除。我是否在給它一個錯誤的指針或什麼?我試着做了一些種類標誌的說法,只是沒有發揮環部分,但我不能,因爲它會在播放中間(套),並同步點播放後立即叫()完成後,在下次調用系統更新時。 FMOD是壞了還是我錯過了一些明顯的東西?或者一些真正晦澀和無證...