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

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

Закрытая тема
 
ELITE
АДмин
offline
Опыт: 4,078
Активность:
вылет цикла изза паузы
если бра цикл типа
Код:
Отояд- Pick every unit in (Units owned by (Triggering player)) and do (Actions)


то если использовать под ним паузы вайтом - то на паузе цикл вываливается

чем можно заменить вайт ???
Старый 19.04.2012, 00:24
Hate
конь вакуумный
offline
Опыт: 42,843
Активность:
таймером?...
Старый 19.04.2012, 00:37
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
никогда не пробывал таймером, как это?!
Старый 19.04.2012, 00:45
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
))
Старый 19.04.2012, 01:04
Hate
конь вакуумный
offline
Опыт: 42,843
Активность:
function jajaja takes nothing returns nothing
local timer t = GetExpiredTimer()
...
call DestroyTimer(t)
set t = null
endfunction

function ololo takes nothing returns nothing
local timer t = CreateTimer()
call TimerStart (t, 1.0, false, jajaja)
set t = null
endfunction
Старый 19.04.2012, 01:04
Msey
????
offline
Опыт: 66,991
Активность:
Старый 19.04.2012, 01:11
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
))
вот так мы нашли индекс массва для всех остальных объектов которые мы используем в заклинании...
Этот способ неприменим когда мы не знаем точное кол во объектов способных задеисвтвовать триггер...
Старый 19.04.2012, 02:42
DaeDR

offline
Опыт: 8,074
Активность:
quq_CCCP, Тогда можно использовать вот такую конструкцию:
» code
scope A

    globals
    private timer array T
    private group array G
    private integer N = 0
    endglobals

function Trig_FireBoom_Timer takes nothing returns nothing
    local integer m = 1
    whilenot ( GetExpiredTimer() == T[m] ) { m++ }
   // дествие с группой G[m]
    call DestroyTimer(T[m])
    call DestroyGroup(G[m])
    if N != m {
        set T[m] = T[N]
        set G[m] = G[N]
        }
    set T[N] = null
    set G[N] = null
    N--
endfunction

function Trig_FireBoom_Actions takes nothing returns nothing
    N++
    set T[N] = CreateTimer ()
    set G[N] = CreateGroup ()
    // дальше пик юнитов и старт таймера
    call TimerStart ( T[N], 10.0, true, function Trig_FireBoom_Timer )
endfunction

//===========================================================================
function InitTrig_FireBoom takes nothing returns nothing
    set gg_trg_FireBoom = CreateTrigger(  )
    ....
    call TriggerAddAction( gg_trg_FireBoom, function Trig_FireBoom_Actions )
endfunction

endscope
DaeDR добавил:
Через массивы можно с легкостью запомнить Кастера, Цель, Координаты и т.п.
Старый 19.04.2012, 06:47
ELITE
АДмин
offline
Опыт: 4,078
Активность:
спасибо, но таймер запустится , но тригер , вызвавший таймер будет продолжаться не дожидаясь окончания таймера
тоесть таймер - это не совсем пауза

а мне надо именно паузу, чтобы выполнение тригера выло остановлено и по завершения паузы оно продолжилось
------------
у меня такая конструкция:

Тригер А
условие
действие 1
.
.
.
действие N - запуск тригера Б
пауза (ожидание выполнения тригера Б циклом с проверкой и паузой)
условие - тригер Б выполнен полностию
действие - конец паузы
Действие M
.
.
.
конец тригера А

///////////
в такой конструкции я не представляю , как прикрутить таймер

или может есть команда, которая будет в обязательном порядке ждать выполнения вложенного (вызываемого) тригера??
Старый 19.04.2012, 09:22
quq_CCCP
Я белый и пушистый!
offline
Опыт: 96,068
Активность:
ELITE,
тебе зачем такой геморой?, мб по подробнее объясниш что ты собрался сделать? Ну и негуи надеюсь...
ибо тогда тебе только вейт поможет).
Старый 19.04.2012, 10:10
JassMan
свободен
offline
Опыт: 4,193
Активность:
Можно сделать задержку в новом потоке через экзекут.
Подробнее тут

Отредактировано JassMan, 19.04.2012 в 10:24.
Старый 19.04.2012, 10:11
ELITE
АДмин
offline
Опыт: 4,078
Активность:
quq_CCCP,
есть тяжелый код с множеством циклов на гуи
в процессе его дарбы надо получить произвести обработку данных сложную с множеством циклов вложенных один в один написанный на жассе в виде одной большой фенкции

так вот при выполнении тригера на гуи циклом вызывается эта самая функция, но тк она тяжелая и её вычисления занимает много времени (секунды 10 реального времени на компе средней мощности) то вызывающий цикл надо останавливать до ожидания выполнения функции
иначе происходит дикий зависон и 100% десинхронизация игроков
а избавится от циклов - это переписывать кода навернона тысяч на 50 строк придется - как понимаете это не вариант и лишник метр к весу карты, которая и так уже на предели допустимого вариком
Старый 19.04.2012, 10:45
quq_CCCP
Я белый и пушистый!
offline
Опыт: 96,068
Активность:
ELITE, ну мб переписать весь алгоритм, тем самым убрать залаг, и десинх, да и карту нужно оптимизировать, чтобы вес был приемлемым....
Продемонстрируй код триггера и напиши что конкретно он делает по пунктам, мб поможем...
Старый 19.04.2012, 10:53
ELITE
АДмин
offline
Опыт: 4,078
Активность:
делаю систему сейва свою

Тригер 1
Код:
событие:
Условие:
Действие:
  Цикл по всем игрокам
   действие:
   получаю ники игроков - присваиваю перенемнной
   
   Цикл 1-6
     действие:
     получаю вещи игроков - присваиваю переменной
   
  // вызываю кодирование ника
  вызов функции 1
  
  // вызываю кодирование вещей
  вызов функции 2
  
 действие получание голда
 еще несколько простых едйствий

  // шифрую 
  вызываю тригер 2

 // сжимаю код
   вызываю тригер 3
  
  // создаю сохранение
  вызываю функцию 3

  дейсткие вывода сообщений
  действие записи в файл
  и еще несколько простых действий



функции 1,2,3 и тригеры 2,3 содержат в каждом минимум по 3 цикла из которых минимум 2 вложенных один в один

и результат их выполнения применяется для выполнения нижележащего действия

поэтому надо ожидать из завершения до продолжения выполнения нижележащих действий
Старый 19.04.2012, 11:10
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
))
Старый 19.04.2012, 11:16
ELITE
АДмин
offline
Опыт: 4,078
Активность:
а нет такой ненужной функции, которая долго выполняется, но ничего не делает при этом и не жрет ресурсов??

ну чтобы её вмето вайта пихнуть
Старый 19.04.2012, 11:29
quq_CCCP
Я белый и пушистый!
offline
Опыт: 96,068
Активность:
ELITE, ну только polled wait описанной выше, в большинстве карт работает корректно и не вызывает лагов, ну Extrime candy wars, близзов, там всё на гуи и система спауна мобов, там поллед вейти и нету лагов, всё работает...э
Но лично мне этот вариант кажется каким-то чудовищным, попробуй мб получится...
Старый 19.04.2012, 11:33
ELITE
АДмин
offline
Опыт: 4,078
Активность:
судя по описанию - она мне не подойдет - тк при нормальной защите карты она порежется- а это крах
Старый 19.04.2012, 11:37
quq_CCCP
Я белый и пушистый!
offline
Опыт: 96,068
Активность:
ELITE, ну пробуй, тут только практика поможет... да и можно настроить защиту так чтобы эту функцию не заменяло...
Старый 19.04.2012, 11:40
alexprey
познающий Unity
offline
Опыт: 66,701
Активность:
ELITE, может объяснишь свою задачу. Тогда можно будет сказать как сделать лучше. А пока ты уже держишь пальцы на курке пистолета, направленного в твое колено
Старый 19.04.2012, 12:06
Закрытая тема

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

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

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

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



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