Казалось бы, вопрос элементарный, а меня можно задизлайкать за непонимание очевиднейших вещей. Но всё не так просто, как кажется.
Ситуация такая. Есть триггер (а вернее их три разных, выполняющихся в разных местах и в разное время, друг другу они не мешают совершенно), который срабатывает после завершения таймера. Там происходит много всяких действий, одно из которых - повышение переменной Fountain на 1 (при запуске карты она обнуляется конечно же).
Сам триггер (как и другие два) выглядит вот так:
Беда в том, что триггер выполняется абсолютно весь. Окно таймера сворачивается, анимации пропадают, юнит, который должен замениться, заменяется и т.д. Всё работает. Кроме увеличения переменной Fountain на 1. Мной было использовано 3 различных способа.
Первый (самый очевидный) через оператор set variable. То есть
Set Fountain = Fountain +1
Казалось бы, должно работать. И да, в самый первый раз наша нулевая переменная становится равной 1. А вот во второй раз становиться двойкой, а в третий раз тройкой она почему-то не хочет. И потому в каждый из трёх раз мне проигрывается действие с условием "if Fountain == 1".
Далее я всё поменял. Разбил действие на три, а именно:
If Fountain == 2 then set Fountain = 3
If Fountain == 1 then set Fountain = 2
If Fountain == 0 then set Fountain = 1
Именно в этом порядке. Каков результат? От прошлого не отличается он ничем совершенно.
Ну а последний способ можете посмотреть на картинке.
По сути, тот же второй, но всё умещено в одно условие. Исход, как вы понимаете, снова печальный и нерабочий.
Собственно, вопрос мой таков: если я всё же ошибся, то в чём именно? А если не ошибся и делал верно, то какие ещё способы существуют для увеличения значения переменной на 1 (оператор Inc() я искал, безуспешно).
Я действительно не понимаю, это у меня голова не работает совершенно, или в редакторе какие-то баги
П.С. JASS и его разновидности не знаю совершенно, огромная просьба объяснять и советовать исключительно с использованием стандартных триггеров.
П.П.С. Если что, у меня версия игры 1.26

Принятый ответ

8gabriel8,
Если что, скидывай карту.
Беда в том, что эта карта из кампании, там всё очень много весит, потому не буду.
PT153,
ну как там дела?
Пока никак, ибо из-за сессии отложил редактор в сторону (собственно, даже сюда времени зайти не было, к сожалению)
Рад, что ты предложил выход, но я, боюсь, твой код себе никак не перенесу, ибо, как писал в вопросе, лишь на GUI могу работать.
8gabriel8,
мне кажется, проблема не в этом триггере, а в другом, который запускает триггеры и таймеры.
Триггер, запускающий таймер, вряд ли многое испортить может
Мдаааа... Я свою ошибку таки нашёл. Она была в самом тупом месте из всех возможных.
Я действительно не понимаю, это у меня голова не работает совершенно, или в редакторе какие-то баги
Цитата из вопроса, у меня не работает голова.
Так вот, это я дурак полный.
Запихнул обнуление своей переменной ВНИМАНИЕ! в триггер, который игрокам-компьютерам каждые 2 секунды обновляет ресурсы. А вместе с этим и обнуляет снова и снова мою переменную. Обнаружил ли я это через дебаги? Нет, просто от скуки и безнадёжности положения начал прокручивать и листать все триггеры.
Спасибо всем, кто пытался помочь, это было очень приятно) Мне жаль, что вы ломали голову и тратили время впустую по моей глупости и невнимательности.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
28
5 лет назад
Отредактирован PT153
0
А зачем? Я всегда его ставлю, никогда проблем не было (а вот при отсутствии были)
Прикол в том, что эта функция имеет такой код.
function DoNothing takes nothing returns nothing
endfunction
Ты серьёзно думаешь, что её наличие на что-то влияет?
При её отсутствии проблем тем более не будет, дело было точно не в ней.
А это практично?
Практичнее кликать по 100500 окошкам? Я говорил про тот большой if, где ты присваиваешь Fountain.
Из-за чего она поменяется, если никаких манипуляций с ней не проводится?
Пока идёт пауза, этот триггер может сработать ещё раз.
У тебя есть пауза в 1 сек., потом если Fountain == 1, то идёт пауза до окончания звука, а после ещё пауза в 3 секунды. После этого проверяется условие Fountain == 2, если да, то пауза до окончания звука, а после ещё пауза в 3 секунды. Далее проверяется условие Fountain == 3, если да, то пауза до окончания звука, а после ещё пауза в 3 секунды.
2
22
5 лет назад
2
prog, ну посмотрим тогда. Поставлю на всякий случай. Но если переменная действительно меняется в момент вейта, единственный способ избавить от проблемы - просто снести из карты данное задание, забыть навсегда про все подобные в других картах и никогда к ним не возвращаться, ибо я не представляю, где и какую ошибку в таком случае придётся исправлять.
Потому, повторюсь уже в который раз, никакой другой триггер в эту секунду Fountain никоим образом изменить не в состоянии. Персонаж, запускающий вес процесс на карте всего один, одновременно в трёх местах он оказаться не в состоянии ни при каких условиях, а значит и три моих триггера запустить одновременно он тоже не может.
0
24
5 лет назад
Отредактирован prog
0
Rare, Еще одна рекомендация, больше декоративного характера - избавиться от двух из трех триггеров и вместо этого выносить в глобалку фонтан который нужно заменять. Результат тот-же, но два триггера разменяны на одну глобалку и не надо в трех местах править одни и те же действия когда нужно что-то поменять.
2
22
5 лет назад
2
PT153,
Пока идёт пауза, этот триггер может сработать ещё раз.
Не может он сработать ещё раз ни при каких обстоятельствах. Первую причину я чуть выше описал, а вторая состоит в том, что при срабатывании он тут же отключается.
prog,
избавиться от трех триггеров и вместо этого выносить в глобалку фонтан который нужно заменять
Если придумаю, как это всё устроить, то сделаю.
Спасибо за все советы. Пойду проверять тогда с выводом. Потом вернусь сюда, сообщу результаты.
2
28
5 лет назад
Отредактирован PT153
2
Как я понял, сначала триггер должен сделать для Fountain == 1 и завершиться. Потом для Fountain == 2, и завершиться. И далее для Fountain == 3.
Если так, то нужно убрать у всех трансляций паузу (Не ждать) и сделать так.
set Fountain = Fountain + 1
Если
    Fountain == 1
Тогда
    Трансляция
Иначе
    Если
        Fountain == 2
    Тогда
        Трансляция
    Иначе
        Если
            Fountain == 3
        Тогда
            Трансляция
        Иначе
            <пусто>

Стоп-стоп-стоп, а сколько вообще раз этот триггер срабатывает?
Не может он сработать ещё раз ни при каких обстоятельствах. Первую причину я чуть выше описал, а вторая состоит в том, что при срабатывании он тут же отключается.
Казалось бы, должно работать. И да, в самый первый раз наша нулевая переменная становится равной 1. А вот во второй раз становиться двойкой, а в третий раз тройкой она почему-то не хочет. И потому в каждый из трёх раз мне проигрывается действие с условием "if Fountain == 1".
Если только 1 раз, то и переменная увеличится 1 раз, всё логично же.
2
22
5 лет назад
2
PT153,
Если только 1 раз, то и переменная увеличится 1 раз, всё логично же.
Этот один раз, и другие два тоже по одному разу. Каждый из трёх увеличивает переменную на 1
0
28
5 лет назад
Отредактирован PT153
0
Этот один раз, и другие два тоже по одному разу. Каждый из трёх увеличивает переменную на 1
То есть я верно понял, что так?
PT153:
сначала триггер должен сделать для Fountain == 1 и завершится. Потом для Fountain == 2, и завершится. И далее для Fountain == 3.
Если да, то стоит попробовать способ, что я изложил выше.
2
17
5 лет назад
Отредактирован N1ghtSiren
2
УУУ, гуи, враг мой древний
Вообще можно прикрутить это всё на один таймер.
Например так:
globals
integer n = 0
endglobals

function movieOne takes nothing returns nothing
    call BJDebugMsg("movieOne actions")
endfunction

function movieTwo takes nothing returns nothing
    call BJDebugMsg("movieTwo actions")
endfunction

function movieThree takes nothing returns nothing
    call BJDebugMsg("movieThree actions")
endfunction

function testLoop takes nothing returns nothing
    local timer t
    local real r
    if n==0 then
        set t = CreateTimer()
        call movieOne()
        set r = 6.0                             //Длительность 1го мувика 
        call TimerStart(t,r,false,function testLoop)
        set n = 1								 
		//Неуверен, но может баговать из-за того что пойдёт проверка дальше и выполнится всё сразу. Да, можно поменять порядок, но return выглядит понятнее.
		return
    elseif n ==1 then
        set t = GetExpiredTimer()
        call movieTwo()
        set r = 5.0                             //Длительность 2го мувика
        call TimerStart(t,r,false,function testLoop)
        set n = 2
		return
    elseif n ==2 then
        set t = GetExpiredTimer()
        call movieThree()
        set r = 5.0                             //Длительность 3го мувика 
        call TimerStart(t,r,false,function testLoop)
        set n = 3
		return    
    elseif n ==3 then
        set t = GetExpiredTimer()
        call DestroyTimer(t)
    elseif n >=4 or n<0 then
        call BJDebugMsg("Some error happened")
    endif
    set t = null
endfunction
Учитесь использовать дебаг, например можете прикрутить на таймер с 0.3 вывод вашей переменной на экран.
эээ кодировка, вернись
2
28
5 лет назад
2
Rare, ну как там дела?
0
23
5 лет назад
0
PyCCKuu_4eJl, забыл добавить debug call BJDebugMsg("Some error happened") чтобы дебуг работал во время редактора а не в свободном доступе =)
0
26
5 лет назад
0
Rare, мне кажется, проблема не в этом триггере, а в другом, который запускает триггеры и таймеры.
Если что, скидывай карту.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.