ARHUI
offline
Опыт:
3,341Активность: |
SaveCodeHandle или SaveFunctionHandle или GetCodeFromString
SaveCodeHandle или SaveFunctionHandle или GetCodeFromString
Как сохранить хендл переменной типа code? ARHUI добавил:
Может можно из строки получить функцию? про ExecuteFunc где-то читал что использование чем-то чревато, но найти не могу. Нужно для организации функции void SetTimeout(code func, real timeout){...} ARHUI добавил:
Мб у неё есть родительский тип? |
31.05.2011, 00:36 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J64_
offline
Опыт:
4,724Активность: |
у него нету родит. типа
код можно хранить токо как переменную, но невозможно указать его как массив лучше ExecuteFunc'а есть тип boolexpr с последующим вызовом при помощи TriggerEvulate/GroupEnum понимаю надо извращаться но... храни boolexpr'ы в глобалках так быстрее будет чем создавать/удалять каждый раз. про первый метод надеюсь понятно, а вот про второй: создай скрытый даммик в каком нибудь определенной точке вне игровой карты и енумай с радиусом 0. так будет работать в другом потоке(хз но наверное), притом будет вызываться как обычный call SomeFunc(), в отличии от TriggerEvulate и да буржуи доказали что первый метод быстрее чем ExecuteFunc, второй - сам придумал |
31.05.2011, 04:48 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ARHUI
offline
Опыт:
3,341Активность: |
AdamanTX, предлагаешь так
?
ARHUI добавил:
То есть для каждой функции которая может быть потенциально вызвана создавать глобалку с её boolexpr? ARHUI добавил:
Парсер запрещает чтобы совпадало имя функции и глобалки, не значит ли это что функции и глобальные переменные как-то связаны ( в смысле в дереве скрипта для движка игры ) ? ARHUI добавил: И кстати невозможно - каждая функция должна возвращать тогда boolean, а в этом случае теряется её универсальность. Отредактировано ARHUI, 31.05.2011 в 05:56. |
31.05.2011, 06:04 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
prog
offline
Опыт:
32,865Активность: |
а вот тут то и начинаются пляски с бубном - используем TriggerEvulate и глобальные переменные и получаем возможность передавать в функцию и из нее любую комбинацию параметров
поясняю как это может выглядеть
1 сохраняем в локальных переменных содержимое глобалок, которые будут использованы для передачи данных 2 записываем в глобалки те данные которые хотим передать в ф-цию 3 triggerevaluate 4 используем в ф-ции значения из глобалок 5 записываем в глобалки возвращаемые значения 6 выходим из ф-ции 7 обрабатываем возвращенные значения или просто вынимаем из глобалок для дальнейшего использования 8 восстанавливаем значение глобалок из локальных переменных возвращаемый булеан при этом можно либо вообще игнорировать либо использовать как индикатор успешности выполнения |
31.05.2011, 10:52 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J64_
offline
Опыт:
4,724Активность: |
ARHUI:
чета никогда невидел чтобы парсер так разрешал... Вроде б все обьяснили, НО зачем использовать аж ТРИ игровых обьекта для вызова функции спустя некоторое время? Достаточно юзать структуру виджасса+всего один таймер; триггер используй глобальный, если ты каждый раз будешь создавать булеанексперианы то нужно и удалять их(у тебя не удаляет). Вот почему надо использовать заранее созданные булеанексперианы. DestroyBoolexpr для хештаблицы есть SaveBoolanExprHandle кста с code'ем тоже можно так проделать(TriggerAddAction)
ну для инитиализации. конешн можна создать стопитьсот переменных типа code и читать/записывать путем бинарного дерева(типо) но это уже изврат :о а вообще можна в твоем примере для функции таймера сразу использовать ту функцию которую надо вызвать.
Для возварщаемых значений юзай темп переменные... |
31.05.2011, 12:30 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
prog
offline
Опыт:
32,865Активность: |
перечитал первый пост... действительно, что мешает напрямую использовать параметр cFunc для запуска таймера вместо function SetTimeoutCB? |
31.05.2011, 21:31 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ARHUI
offline
Опыт:
3,341Активность: |
prog, а где этот таймер будет удалятся?
ARHUI добавил: тогда в каждую ф-ию надо добавить код для удаления expiredtimer |
31.05.2011, 22:40 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J64_
offline
Опыт:
4,724Активность: |
вроде бы есть событие EVENT_TIMER_EXPIRED... |
01.06.2011, 02:10 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ARHUI
offline
Опыт:
3,341Активность: |
которое не различит локально или глобально он был создан, идея не в том чтобы один раз вызвать данную функцию, а использовать её повсеместно в любом коде, в котором могут быть и другие таймеры в разных потоках. |
01.06.2011, 04:08 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|