![]()
ELITE
АДмин
![]() ![]() offline
Опыт:
4,078Активность: |
вылет цикла изза паузы
если бра цикл типа
Код:
то если использовать под ним паузы вайтом - то на паузе цикл вываливается чем можно заменить вайт ??? |
![]() |
#1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Hate
конь вакуумный
![]() ![]() offline
Опыт:
42,843Активность: |
таймером?... |
![]() |
#2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
NIKZ
Изучаю Jass
![]() ![]() offline
Опыт:
6,036Активность: |
никогда не пробывал таймером, как это?! |
![]() |
#3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Msey
????
![]() offline
Опыт:
66,991Активность: |
((код jass
function SpellDamage takes nothing returns nothing
local timer t = GetExpiredTimer() local integer h = GetHandleId(t) local unit caster = LoadUnitHandle(udg_hash,h,1) local unit target = LoadUnitHandle(udg_hash,h,2) local integer counter = LoadInteger(udg_hash,h,3) if counter>0 then call UnitDamageTarget(caster,target,1.0,true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null) call SaveInteger(udg_hash,h,3,counter-1) else call DestroyTimer(t) call FlushChildHashtable(udg_hash,h) endif set caster = null set target = null set t = null endfunction function Spell takes nothing returns nothing
local unit caster = GetSpellAbilityUnit() local unit target = GetSpellTargetUnit() local timer t = CreateTimer() local integer h = GetHandleId(t) call SaveUnitHandle(udg_hash,h,1,caster) call SaveUnitHandle(udg_hash,h,2,target) call SaveInteger(udg_hash,h,3,125) call TimerStart(t,0.04,true,function SpellDamage) set caster = null set target = null set t = null endfunction function SpellCond takes nothing returns boolean
return GetSpellAbilityId()=='A000' endfunction =========================================================================== function InitTrig_Spell takes nothing returns nothing set gg_trg_Spell = CreateTrigger() call TriggerRegisterPlayerUnitEvent(gg_trg_Spell,Player(0),EVENT_PLAYER_UNIT_SPELL_CAST,null) call TriggerAddCondition(gg_trg_Spell,Condition(function SpellCond)) call TriggerAddAction(gg_trg_Spell,function Spell) set udg_hash = InitHashtable() endfunction )) |
![]() |
#4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Hate
конь вакуумный
![]() ![]() offline
Опыт:
42,843Активность: |
|
![]() |
#5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Msey
????
![]() offline
Опыт:
66,991Активность: |
|
![]() |
#6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
quq_CCCP
Я белый и пушистый!
![]() ![]() offline
Опыт:
96,068Активность: |
NIKZ, ELITE, таймер в jass способен запускать функции по своему истечению, в функции вызванной таймером всегда можно найти этот таймер с помощью функции GetExpriredTimer(). а чтобы связать данные с таймером нужно использовать хеш таблицы или массивы глобальных переменных, исходя из того что в карты типа доты, пуджей не может быть больше 10, то и таймеров и самих пужей тоже не может быть больше 10, исходя из этого мы ищем номер игрока юнита применившего способность, и используем его как индекс массива, так как таймер сохранён в массив глобалок то мы всегда можем найти индекс массива в цикле:
((код jass
local timer t = GetExpriedTimer()
local integer nPlayerIndex = 0 loop
exitwhen nIndex > 12 if( t == udg_HookTimer[nPlayerIndex]) then exitwhen true endif set nPlayerIndex = nPlayerIndex + 1
endloop )) вот так мы нашли индекс массва для всех остальных объектов которые мы используем в заклинании... Этот способ неприменим когда мы не знаем точное кол во объектов способных задеисвтвовать триггер... |
![]() |
#7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DaeDR
![]() ![]() offline
Опыт:
8,074Активность: |
quq_CCCP, Тогда можно использовать вот такую конструкцию:
» code
DaeDR добавил: Через массивы можно с легкостью запомнить Кастера, Цель, Координаты и т.п. |
![]() |
#8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
ELITE
АДмин
![]() ![]() offline
Опыт:
4,078Активность: |
спасибо, но таймер запустится , но тригер , вызвавший таймер будет продолжаться не дожидаясь окончания таймера
тоесть таймер - это не совсем пауза а мне надо именно паузу, чтобы выполнение тригера выло остановлено и по завершения паузы оно продолжилось ------------ у меня такая конструкция: Тригер А условие действие 1 . . . действие N - запуск тригера Б пауза (ожидание выполнения тригера Б циклом с проверкой и паузой) условие - тригер Б выполнен полностию действие - конец паузы Действие M . . . конец тригера А /////////// в такой конструкции я не представляю , как прикрутить таймер или может есть команда, которая будет в обязательном порядке ждать выполнения вложенного (вызываемого) тригера?? |
![]() |
#9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
quq_CCCP
Я белый и пушистый!
![]() ![]() offline
Опыт:
96,068Активность: |
ELITE, тебе зачем такой геморой?, мб по подробнее объясниш что ты собрался сделать? Ну и негуи надеюсь... ибо тогда тебе только вейт поможет). |
![]() |
#10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
JassMan
свободен
![]() offline
Опыт:
4,193Активность: |
Можно сделать задержку в новом потоке через экзекут.
Подробнее тут Отредактировано JassMan, 19.04.2012 в 10:24. |
![]() |
#11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
ELITE
АДмин
![]() ![]() offline
Опыт:
4,078Активность: |
quq_CCCP,
есть тяжелый код с множеством циклов на гуи в процессе его дарбы надо получить произвести обработку данных сложную с множеством циклов вложенных один в один написанный на жассе в виде одной большой фенкции так вот при выполнении тригера на гуи циклом вызывается эта самая функция, но тк она тяжелая и её вычисления занимает много времени (секунды 10 реального времени на компе средней мощности) то вызывающий цикл надо останавливать до ожидания выполнения функции иначе происходит дикий зависон и 100% десинхронизация игроков а избавится от циклов - это переписывать кода навернона тысяч на 50 строк придется - как понимаете это не вариант и лишник метр к весу карты, которая и так уже на предели допустимого вариком |
![]() |
#12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
quq_CCCP
Я белый и пушистый!
![]() ![]() offline
Опыт:
96,068Активность: |
ELITE, ну мб переписать весь алгоритм, тем самым убрать залаг, и десинх, да и карту нужно оптимизировать, чтобы вес был приемлемым.... Продемонстрируй код триггера и напиши что конкретно он делает по пунктам, мб поможем... |
![]() |
#13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
ELITE
АДмин
![]() ![]() offline
Опыт:
4,078Активность: |
делаю систему сейва свою
Тригер 1 Код:
функции 1,2,3 и тригеры 2,3 содержат в каждом минимум по 3 цикла из которых минимум 2 вложенных один в один и результат их выполнения применяется для выполнения нижележащего действия поэтому надо ожидать из завершения до продолжения выполнения нижележащих действий |
![]() |
#14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
quq_CCCP
Я белый и пушистый!
![]() ![]() offline
Опыт:
96,068Активность: |
ELITE, вызывай функции 1.2.3 с помощью таймера через некоторый интервал, к примеру 1 сек, и проверяй глобальной переменной сколько раз таймер запустил функцию, а затем останавливай его, ну так же можно попробовать использовать call PolledWait(), он многократно останавливает и вновь запускает триггер, правда может не получтся, ах да это поганая бэ функция с отвратительным содержимым...
» Не_Для слабонервных
((код jass
function PolledWait takes real duration returns nothing
local timer t local real timeRemaining if (duration > 0) then
set t = CreateTimer() call TimerStart(t, duration, false, null) loop set timeRemaining = TimerGetRemaining(t) exitwhen timeRemaining <= 0 If we have a bit of time left, skip past 10% of the remaining
duration instead of checking every interval, to minimize the polling on long waits. if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then call TriggerSleepAction(0.1 * timeRemaining) else call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL) endif endloop call DestroyTimer(t) endif endfunction )) |
![]() |
#15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
ELITE
АДмин
![]() ![]() offline
Опыт:
4,078Активность: |
а нет такой ненужной функции, которая долго выполняется, но ничего не делает при этом и не жрет ресурсов??
ну чтобы её вмето вайта пихнуть |
![]() |
#16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
quq_CCCP
Я белый и пушистый!
![]() ![]() offline
Опыт:
96,068Активность: |
ELITE, ну только polled wait описанной выше, в большинстве карт работает корректно и не вызывает лагов, ну Extrime candy wars, близзов, там всё на гуи и система спауна мобов, там поллед вейти и нету лагов, всё работает...э Но лично мне этот вариант кажется каким-то чудовищным, попробуй мб получится... |
![]() |
#17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
ELITE
АДмин
![]() ![]() offline
Опыт:
4,078Активность: |
судя по описанию - она мне не подойдет - тк при нормальной защите карты она порежется- а это крах
|
![]() |
#18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
quq_CCCP
Я белый и пушистый!
![]() ![]() offline
Опыт:
96,068Активность: |
ELITE, ну пробуй, тут только практика поможет... да и можно настроить защиту так чтобы эту функцию не заменяло... |
![]() |
#19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
alexprey
познающий Unity
![]() ![]() offline
Опыт:
66,701Активность: |
ELITE, может объяснишь свою задачу. Тогда можно будет сказать как сделать лучше. А пока ты уже держишь пальцы на курке пистолета, направленного в твое колено |
![]() |
#20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|