XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
FatalBlade

offline
Опыт: 7,398
Активность:
Функция вызывающая сама себя - Желательно ли использовать следующую функцию?
Функция выбирает номер ячейки массива, и проигрывает саундтрек который в этой ячейке находится. Из другого массива он берёт реальное число - длинну саундтрека. Затем запускается глобальный таймер на время длинны саундтрека, а по истечению таймера функция опять запускает саму себя, и проделывает всё заново. Вот:
function Trig_Music_Random_Actions takes nothing returns nothing
    local integer x = GetRandomInt( 1, 12 )
    call PlayThematicMusic( udg_Musics[x] )
    call TimerStart( udg_MusicTimer, udg_MusicLength[x], false, function Trig_Music_Random_Actions )
endfunction
Вопрос: не будет ли такая функция ущербной? Это вроде как называется рекурсией, не?
Старый 21.06.2012, 23:12
FatalBlade

offline
Опыт: 7,398
Активность:
StarChild:
там пишется отдельная функция на рандом, принимающая прошлое значение
хм. Да действительно нужно, не подумал. Но помоему это можно сделать с ещё одной глобалкой по типу Строка. Думаю тогда не нужна ещё одна функция.
Старый 21.06.2012, 23:47
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
FatalBlade, а что мешает юзать паразитную функцию с одной только строчкой call ExcuteFunc("Имя твоей функции")
Старый 22.06.2012, 02:18
FatalBlade

offline
Опыт: 7,398
Активность:
В конце я решил сделать с добавлением глобалки - интежера. Та же функция. Вот так:
function Trig_Music_Random_Actions takes nothing returns nothing
    local integer x = GetRandomInt( 1, 11 )
    local real time = 0.33

    if x != udg_RndMusic then
        set udg_RndMusic = x
        set time = udg_MusicLength[x]
        call PlayThematicMusic( udg_Musics[x] )
    endif

    call TimerStart( udg_MusicTimer, time, false, function Trig_Music_Random_Actions )
endfunction
То есть если выбранный саундтрек был только что проигран, активируется таймер на 0.33 секунды, и функция запускается снова.

Отредактировано FatalBlade, 22.06.2012 в 03:07.
Старый 22.06.2012, 02:27
J64_

offline
Опыт: 4,724
Активность:
StarChild:
int SRandom(int PrevRnd)
{
    int NewRnd
    loop
    {
        NewRnd = GetRandomInt(1,12)
        exitwhen(NewRnd != PrevRnd)
    }
}
Эта функция может вызываться бесконечно (почти).
вот лучше:
int array a
int c
...
void initAIndexes ()
{
	c = 0
	while (c < 12)
	{
		a[c] = c
		c++
	}
}
int getAIndex ()
{
	int i, x
	if (c == 0)
	{
		c = 12
	}
	i = GetRandomInt(0, c - 1)
	x = a[i]
	c--
	a[i] = a[c]
	return x
}
...
Старый 22.06.2012, 06:24
Doc

offline
Опыт: 63,163
Активность:
FatalBlade, лол и если рандом совпадет у тебя в колонках будет тишина, класс.
Judycaster64, бред, старчайлд все правильно написал.
Старый 22.06.2012, 13:02
FatalBlade

offline
Опыт: 7,398
Активность:
Doc:
лол и если рандом совпадет у тебя в колонках будет тишина, класс.
Всего на 0.33 секунды. Потом функция запускается заново, и выбирается другой саундтрек. Может опять совпадёт... ну ок, ещё 0.33 секунды, и того 0.66 секунд. Третий раз совпадёт? Да это уже почти не реально. И даже если вопреки теории вероятности такое произойдёт, то мы подождём ещё 0.33 секунды. И даже в таком случае, возможному только в законах Мерфи, мы будем ждать всего 1 секунду, чего игрок даже не заметит. )))
Старый 22.06.2012, 16:31
J64_

offline
Опыт: 4,724
Активность:
Doc: объяснись, да подробнее.
int array a
int c
...
void initAIndexes ()
{
	c = 0
	while (c < 12)
	{
		a[c] = c
		c++
	}
}
int getAIndex ()
{
	int i, x
	if (c == 0)
	{
		c = 12
	}
	i = GetRandomInt(0, c - 1)
	x = a[i]
	c--
	a[i] = a[c]
	a[c] = x
	return x
}
...
оказывается одну строчку забыл.
Старый 22.06.2012, 20:38
FatalBlade

offline
Опыт: 7,398
Активность:
Народ. Подскажите плз, почему у некоторых игроков данный алгоритм с музыкой работает, а у некоторых нет? У тех что не работает, проигрывается стандартная варкрафтовская музыка. Зависит от расы. За андедов играет то что я хочу, а вот за людей стандартная. В чём дело? Как это исправить?

Отредактировано FatalBlade, 24.06.2012 в 16:20.
Старый 24.06.2012, 16:06
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 14:21.