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

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

Ответ
 
ARHUI

offline
Опыт: 3,341
Активность:
SaveCodeHandle или SaveFunctionHandle или GetCodeFromString
SaveCodeHandle или SaveFunctionHandle или GetCodeFromString
Как сохранить хендл переменной типа code?
ARHUI добавил:
Может можно из строки получить функцию? про ExecuteFunc где-то читал что использование чем-то чревато, но найти не могу. Нужно для организации функции void SetTimeout(code func, real timeout){...}
ARHUI добавил:
Как сохранить хендл переменной типа code
Мб у неё есть родительский тип?
Старый 31.05.2011, 00:36
J64_

offline
Опыт: 4,724
Активность:
у него нету родит. типа
код можно хранить токо как переменную, но невозможно указать его как массив
лучше ExecuteFunc'а есть тип boolexpr с последующим вызовом при помощи TriggerEvulate/GroupEnum
понимаю надо извращаться но...
храни boolexpr'ы в глобалках так быстрее будет чем создавать/удалять каждый раз.
про первый метод надеюсь понятно, а вот про второй: создай скрытый даммик в каком нибудь определенной точке вне игровой карты и енумай с радиусом 0. так будет работать в другом потоке(хз но наверное), притом будет вызываться как обычный call SomeFunc(), в отличии от TriggerEvulate
и да буржуи доказали что первый метод быстрее чем ExecuteFunc, второй - сам придумал
Старый 31.05.2011, 04:48
ARHUI

offline
Опыт: 3,341
Активность:
AdamanTX, предлагаешь так
void SetTimeoutCB(){
    timer tmTimer = GetExpiredTimer()
    int iTimerHandle = GetHandleId( tmTimer )
    DestroyTimer( tmTimer )
    tmTimer = null
    trigger trTrigger = LoadTriggerHandle( GlblHT, iTimerHandle, 0 )
    TriggerEvaluate( trTrigger )
    DestroyTrigger( trTrigger )
    trTrigger=null
}

void SetTimeout(code cFunc, float fTimeout){
    timer tmTimer = CreateTimer()
    int iTimerHandle = GetHandleId( tmTimer )
    trigger trTrigger = CreateTrigger()
    TriggerAddCondition( trTrigger, Condition( cFunc ) )
    SaveTriggerHandle( GlblHT, iTimerHandle, 0, trTrigger)
    TimerStart( tmTimer, fTimeout, false, function SetTimeoutCB)
    tmTimer = null
    trTrigger = null
}
?
ARHUI добавил:
храни boolexpr'ы в глобалках так быстрее будет чем создавать/удалять каждый раз.
То есть для каждой функции которая может быть потенциально вызвана создавать глобалку с её boolexpr?
ARHUI добавил:
Парсер запрещает чтобы совпадало имя функции и глобалки, не значит ли это что функции и глобальные переменные как-то связаны ( в смысле в дереве скрипта для движка игры ) ?
ARHUI добавил:
И кстати
храни boolexpr'ы в глобалках так быстрее будет чем создавать/удалять каждый раз.
невозможно - каждая функция должна возвращать тогда boolean, а в этом случае теряется её универсальность.

Отредактировано ARHUI, 31.05.2011 в 05:56.
Старый 31.05.2011, 06:04
prog

offline
Опыт: 32,865
Активность:
а вот тут то и начинаются пляски с бубном - используем TriggerEvulate и глобальные переменные и получаем возможность передавать в функцию и из нее любую комбинацию параметров
поясняю как это может выглядеть
1 сохраняем в локальных переменных содержимое глобалок, которые будут использованы для передачи данных
2 записываем в глобалки те данные которые хотим передать в ф-цию
3 triggerevaluate
4 используем в ф-ции значения из глобалок
5 записываем в глобалки возвращаемые значения
6 выходим из ф-ции
7 обрабатываем возвращенные значения или просто вынимаем из глобалок для дальнейшего использования
8 восстанавливаем значение глобалок из локальных переменных
возвращаемый булеан при этом можно либо вообще игнорировать либо использовать как индикатор успешности выполнения
Старый 31.05.2011, 10:52
J64_

offline
Опыт: 4,724
Активность:
ARHUI:
AdamanTX, предлагаешь так
void SetTimeoutCB(){
    timer tmTimer = GetExpiredTimer()
    int iTimerHandle = GetHandleId( tmTimer )
    DestroyTimer( tmTimer )
    tmTimer = null
    trigger trTrigger = LoadTriggerHandle( GlblHT, iTimerHandle, 0 )
    TriggerEvaluate( trTrigger )
    DestroyTrigger( trTrigger )
    trTrigger=null
}

void SetTimeout(code cFunc, float fTimeout){
    timer tmTimer = CreateTimer()
    int iTimerHandle = GetHandleId( tmTimer )
    trigger trTrigger = CreateTrigger()
    TriggerAddCondition( trTrigger, Condition( cFunc ) )
    SaveTriggerHandle( GlblHT, iTimerHandle, 0, trTrigger)
    TimerStart( tmTimer, fTimeout, false, function SetTimeoutCB)
    tmTimer = null
    trTrigger = null
}
?
ARHUI добавил:
храни boolexpr'ы в глобалках так быстрее будет чем создавать/удалять каждый раз.
То есть для каждой функции которая может быть потенциально вызвана создавать глобалку с её boolexpr?
ARHUI добавил:
Парсер запрещает чтобы совпадало имя функции и глобалки, не значит ли это что функции и глобальные переменные как-то связаны ( в смысле в дереве скрипта для движка игры ) ?
чета никогда невидел чтобы парсер так разрешал...
ARHUI добавил:
И кстати
храни boolexpr'ы в глобалках так быстрее будет чем создавать/удалять каждый раз.
невозможно - каждая функция должна возвращать тогда boolean, а в этом случае теряется её универсальность.
Вроде б все обьяснили, НО зачем использовать аж ТРИ игровых обьекта для вызова функции спустя некоторое время? Достаточно юзать структуру виджасса+всего один таймер; триггер используй глобальный, если ты каждый раз будешь создавать булеанексперианы то нужно и удалять их(у тебя не удаляет). Вот почему надо использовать заранее созданные булеанексперианы.
DestroyBoolexpr
для хештаблицы есть
SaveBoolanExprHandle
кста с code'ем тоже можно так проделать(TriggerAddAction)
ну для инитиализации.
конешн можна создать стопитьсот переменных типа code и читать/записывать путем бинарного дерева(типо)
но это уже изврат :о
а вообще можна в твоем примере для функции таймера сразу использовать ту функцию которую надо вызвать.
Для возварщаемых значений юзай темп переменные...
Старый 31.05.2011, 12:30
prog

offline
Опыт: 32,865
Активность:
перечитал первый пост...
действительно, что мешает напрямую использовать параметр cFunc для запуска таймера вместо function SetTimeoutCB?
Старый 31.05.2011, 21:31
ARHUI

offline
Опыт: 3,341
Активность:
prog, а где этот таймер будет удалятся?
ARHUI добавил:
тогда в каждую ф-ию надо добавить код для удаления expiredtimer
Старый 31.05.2011, 22:40
J64_

offline
Опыт: 4,724
Активность:
вроде бы есть событие EVENT_TIMER_EXPIRED...
Старый 01.06.2011, 02:10
ARHUI

offline
Опыт: 3,341
Активность:
вроде бы есть событие EVENT_TIMER_EXPIRED...
которое не различит локально или глобально он был создан, идея не в том чтобы один раз вызвать данную функцию, а использовать её повсеместно в любом коде, в котором могут быть и другие таймеры в разных потоках.
Старый 01.06.2011, 04:08
prog

offline
Опыт: 32,865
Активность:
если ф-ция будет использоваться только с вызовом через локальный таймер - никто не мешает удалять таймер из функции
на cjass можно даже макрос написать, который будет неявно добавлять код удаления таймера в начало соответствующим образом объявленной функции
на мой взгляд это предпочтительнее чем извращения с triggerevaluate
но если этот вариант не подходит, то остается только грамотно реализовать использование triggerevaluate
1 использовать один глобальный триггер и или создавать и удалять локальные
2 удалять из триггера triggercondition при удалении триггера
3 использовать однажды созданные booleanexpr или удалять их после использования
4 чистить на всякий случай запись в хештаблице после удаления триггера и таймера
по поводу EVENT_TIMER_EXPIRED
тоже вполне неплохой вариант
можно попробовать так:
используем локальные триггер и таймер
триггер назначем на срабатывание по истечению нашего таймера
выдаем нашу ф-цию триггеру как condition (можно и как action, но что-то мне подсказывает что не стоит)
выдаем триггеру как второй condition ф-цию, которая удаляет и таймер и триггер (опять-таки можно и через action и возможно даже придется если триггер будет сопротивляться удалению из condition)
записываем в хештаблицу полученные хендлы triggerconditiono-ов чтобы удалить их из триггера при удалении
Старый 01.06.2011, 11:13
Ответ

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

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

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

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



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