вот функция TimedSound типо должна запускать звук через t сек.
        void TimedSoundExp ()
        {
            timer tm=GetExpiredTimer()
            int h = GetHandleId(tm)
            int a = LoadInteger(hash,h,0)
            
            sound soundHandle = CreateSound(LoadStr(hash,h,1), false, false, true, 12700, 12700, "")
            StartSound(soundHandle)
            KillSoundWhenDone(soundHandle)
            
            if View[GetPlayerId(GetLocalPlayer())].battle_index != a
            {
                SetSoundVolume(soundHandle, 0)
            }
            
            FlushChildHashtable(hash,h)
            DestroyTimer(tm)
            
            tm=null
            soundHandle=null
        }
        
        void TimedSound (real t, int index, string path)
        {
                timer tm=CreateTimer(); int h = GetHandleId(tm)
                SaveInteger(hash,h,0,index)
                SaveStr(hash,h,1,path)
                TimerStart(tm, t, false, function TimedSoundExp)
                tm=null
        }
вот отсюда вызывается
                pl[0].PlaySound("announcer\\Round.wav")
                real delay = .56
                if round==2 {delay=.65}
                elseif round==4 {delay=1}
                TimedSound(delay, index, "announcer\\"+I2S(round)+".wav")
pl[0].PlaySound если что
void PlaySound (string soundName)
        {
            speech = CreateSound(soundName, false, false, true, 12700, 12700, "")
            StartSound(speech)
            KillSoundWhenDone(speech)
            AttachSoundToUnit(speech, mdl)
            if IAbsBJ(View[GetPlayerId(GetLocalPlayer())].battle_index) != arena
            {
                SetSoundVolume(speech, 0)
            }
        }
Мне надо запускать звук с номером раунда после слова "раунд"
Но почему-то иногда звук срабатывает сразу вместе с предыдущим, и похоже что совершенно случайным образом - иногда все работает как надо, иногда нет.
как исправить?

Принятый ответ

Тут походу дело в канале звука, типа пока канал занят одним звуком, второй не проигрывается.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
26
6 лет назад
2
В GUI есть действие Wait for sound вроде, типа ждёт до конца воспроизведения звука «Раунд», потом ставишь звук с номером раунда. А в jass мало шарю.
2
32
6 лет назад
2
Тут походу дело в канале звука, типа пока канал занят одним звуком, второй не проигрывается.
Принятый ответ
0
20
6 лет назад
0
quq_CCCP, самое забавное именно то, что иногда оба звука проигрываются одновременно, а иногда как надо.
8gabriel8, вейты нельзя использовать внутри функций вызванных ExecuteFunc или таймером, хотя попробую переделать чтобы запускалось триггером, спс
                a.pl[0].PlaySound("announcer\\Round.wav")
                TriggerWaitForSound(a.pl[0].speech, 3.)
                a.pl[0].PlaySound("announcer\\"+I2S(a.round)+".wav")
не работает, задержки нет
триггер запускаю через TriggerExecute, TriggerEvaluate не срабатывает почему-то

переделал чтобы триггер запускался через периодик ивент, а в коде он просто включался/выключался
TriggerWaitForSound все равно не работает
сделал через обычный TriggerSleepAction
0
26
6 лет назад
Отредактирован 8gabriel8
0
Загруженные файлы
0
20
6 лет назад
0
То есть эта фигня не работает без создания объектов в редакторе звука? ну ладно
0
28
6 лет назад
Отредактирован PT153
0
То есть эта фигня не работает без создания объектов в редакторе звука? ну ладно
Работать будет, если создать в редакторе звука, скопировать сгенерированный код и заменить переменные на свои, а после в редакторе звука удалить созданный звук/музыку.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.