Казалось бы, вопрос элементарный, а меня можно задизлайкать за непонимание очевиднейших вещей. Но всё не так просто, как кажется.
Ситуация такая. Есть триггер (а вернее их три разных, выполняющихся в разных местах и в разное время, друг другу они не мешают совершенно), который срабатывает после завершения таймера. Там происходит много всяких действий, одно из которых - повышение переменной 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 секунды обновляет ресурсы. А вместе с этим и обнуляет снова и снова мою переменную. Обнаружил ли я это через дебаги? Нет, просто от скуки и безнадёжности положения начал прокручивать и листать все триггеры.
Спасибо всем, кто пытался помочь, это было очень приятно) Мне жаль, что вы ломали голову и тратили время впустую по моей глупости и невнимательности.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
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, мне кажется, проблема не в этом триггере, а в другом, который запускает триггеры и таймеры.
Если что, скидывай карту.
0
28
5 лет назад
Отредактирован PT153
0
all BJDebugMsg("Some error happened")
BJDebugMsg плохая функция (там цикл с перебором всех игроков), лучше использовать эту.
function DebugMsg takes string s returns nothing
    debug call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 5., s)
endfunction
По сети работает отлично.

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

Запихнул обнуление своей переменной ВНИМАНИЕ! в триггер, который игрокам-компьютерам каждые 2 секунды обновляет ресурсы. А вместе с этим и обнуляет снова и снова мою переменную.
Для таких целей и есть F11, позволяет выяснить, где что используется.
2
24
5 лет назад
2
Rare, значения полученные из дебага должны были навести тебя на правильный путь - ты должен был увидеть, что переменная на старте триггера нулевая, а значит кто-то её трогает между срабатываниями триггера. А дальше то о чем говорит PT153 - поиск мест использования переменной через F11.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.