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

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

 
ArchWorm
Матрица незалежности
offline
Опыт: 4,675
Активность:
Iron, юзай моск:
Цитата:
Отсюда вывод, что скорее всего, виноваты паровозные триговые функции-условия

Я имел в виду функции, которые генерятся редактором для условий.
Старый 23.11.2006, 21:56
Iron
Листовой
offline
Опыт: 24,427
Активность:
ArchWorm12612, а ты отконвертируюй те триггеры в текст. Различия в условиях никакого, а баг есть. Так что это точно не неправильная работа переводчика GUI.
Старый 23.11.2006, 22:36
NETRAT

offline
Опыт: 83,712
Активность:
как ты сравниваешь эти пары триггеров? - они же абсолютно разные
Почему я писал эти конструкции именно так? Да потому что я тогда не пользовался командой Skip Remaining Actions

Обьяснение "спецэффекта"


Внимательно посмотри на дейсвтие триггера Up:
Код:
If (юнит на 1 этаже) then
    Перекинуть его на 2 этаж
else
    If (юнит на 2 этаже) then
        Перекинуть его на 3 этаж
    else
        If (юнит на 3 этаже) then
            Перекинуть его на 4 этаж
        else
        endif
    endif
endif

Данная структура изоморфна сишной:
Код:
switch (level)
{
    1:level=2;break;
    2:level=3;break;
    3:level=4;
}

Триггер, который ты считаешь забагованным:
Код:
If (юнит на 1 этаже) then
    Перекинуть его на 2 этаж
else
endif
If (юнит на 2 этаже) then
    Перекинуть его на 3 этаж
else
endif
If (юнит на 3 этаже) then
    Перекинуть его на 4 этаж
else
endif

Чувствуешь разницу? Эта конструкция изоморфна сишной:
Код:
switch (level)
{
    1:level=2;
    2:level=3;
    3:level=4;
}

Здесь в любом случае будут проверяться все три проверки, при чем последовательно ибо если юнит на первом этаже, то мы получим
(level == 1) => set level = 2;
(level == 2) => set level = 3;
(level == 3) => set level = 4;
Для того что бы триггер работал правильно (как в первом случае), он должен выглядеть так(так как это явно не первый вариант реализации такого триггера, назовем его "реверсным порядком"):
Код:
If (юнит на 3 этаже) then
    Перекинуть его на 4 этаж
else
endif
If (юнит на 2 этаже) then
    Перекинуть его на 3 этаж
else
endif
If (юнит на 1 этаже) then
    Перекинуть его на 2 этаж
else
endif

Изоморфизм:
Код:
switch (level)
{
    3:level=4;
    2:level=3
    1:level=2;
}

Или так, что более понятно и более привычно и более оптимально (хотя, не более оптимально чем первый вариант):
Код:
If (юнит на 1 этаже) then
    Перекинуть его на 2 этаж
    Skip Remaining Actions (aka return)
else
endif
If (юнит на 2 этаже) then
    Перекинуть его на 3 этаж
    Skip Remaining Actions (aka return)
else
endif
If (юнит на 3 этаже) then
    Перекинуть его на 4 этаж
    Skip Remaining Actions (aka return)
else
endif
Изоморфизм - то же самое что и у первой конструкции - для нашего частного случая это:
Код:
switch (level)
{
    1:level=2;return;
    2:level=3;return;
    3:level=4;
}

в jass нету аналогов операторов break и continue (о чем лично я очень жалею), но в частном случае их можно заменить на return (Skip Remaining Actions)

В-общем, ты просто упустил из виду что это оператор case(с break в каждой строке) и при правильной работе он должен завершаться сразу после выбора, а в твоем случае, эти команды break утеряны, почему и происходит последовательное прохождение всех команд.

Собственно, вопрос считаю исчерпанным

Достаточно было один раз глянуть на эти триггеры, ибо сам допускал такие ошибки, впрочем, полагаю этим страдали все начинающие кодеры - невнимательностью.

P.S. Do Nothing тут абсолютно ни при чем, и был введен близзам исключительно для эстетов у которых возникает вопрос "а что писать здесь, если здесь оно не должно ничего делать?"

Переименовываю тему что бы не смущать читателей

NETRAT добавил:
Почему я сравниваю с С? потому что считаю его достаточно компактным и при этом наглядным и многофункциональным языком. Да и если бы я написал на асме, не думаю что было бы понятней =)

Отредактировано NETRAT, 24.11.2006 в 02:19.
Старый 24.11.2006, 02:20
p01nTT

offline
Опыт: 11,160
Активность:
Do nothing было сделано для конструкции if (condition) then do (action1) else do (action2).Что бы можно было вставить какое-то действие,если действие после else или then делать не надо

p01nTT добавил:
Ну тоже самое сказал NETRAT
Старый 24.11.2006, 14:22
Iron
Листовой
offline
Опыт: 24,427
Активность:
Цитата:
Достаточно было один раз глянуть на эти триггеры, ибо сам допускал такие ошибки, впрочем, полагаю этим страдали все начинающие кодеры - невнимательностью.

Честно говоря я ничего не понял из твоего обьяснения. В частности не понял как могут выполняться условия в then если if дает false (что == ничего не понял).
Обьясни на пальцах. Видимо я не совсем корректно понимаю смысл самого If-а.
Старый 24.11.2006, 15:42
J
expert
offline
Опыт: 48,447
Активность:
Iron нетрат имел ввиду что:
например у тебя есть интегер == 1
ты проверяеш его.. если он равен 1, то сделать его 2
если он равен 2 то сделать его 3
если он равен 3 то сделать его 4,

после этих действий, интегер каким бы он небыл (<4), то он стал бы равен 4.
Старый 24.11.2006, 15:57
ArchWorm
Матрица незалежности
offline
Опыт: 4,675
Активность:
О, господи, а ларчик-то просто открывался... :/
Хорошо, что есть глазастые люди типа NETRAT
Старый 24.11.2006, 16:15
Iron
Листовой
offline
Опыт: 24,427
Активность:
Jon, ха, но тогда бы не было бага с уезжанием камеры игрока в нижний левый угол. Т.е. просто должно было бы происходить перемещение сразу на 4-й этаж (так как и происходит), но вот почему камера то порится?
Старый 24.11.2006, 16:22
J
expert
offline
Опыт: 48,447
Активность:
Iron опыт показал что лучше сначало искать баг в алгоритмике кода, а не придумывать баги
Старый 24.11.2006, 16:39
NETRAT

offline
Опыт: 83,712
Активность:
nic666 да, я изучал TP, возможно новичкам покажется более понятным, но, после С все языки меркнут

Iron это вторично, ошибка
Цитата:
после этих действий, интегер каким бы он небыл (<4), то он стал бы равен 4.
вообще, она не сразу должна на четвертый уезжать, а по очереди все проезжать, возможно, такое переключение рождает баг
Старый 24.11.2006, 23:56
Iron
Листовой
offline
Опыт: 24,427
Активность:
NETRAT, ладно, тут все ясно. Но всеравно есть некий баг с ифом. Просто я на одной карте делал предвижение кораблей по сетке, т.е. там была сет регеонов, и при вхождении коробля в регион выбрасывалось рандомное 1 или 2, и было 2-а ифа, если 1-н, то корабль отправлялся к правому нижнему регеону, если 2-а то к левому. И такой тригер для каждого регеона. И возникла проблема, хоть триггеры и идентичны для всех регеонов, но в части регеонов корабль застревал, в одних и тех же, причем я просмотрел триггеры все оказалось нормально, пробовал химичить с размерами регеонов, но никакого эффекта.
Старый 25.11.2006, 15:31
NETRAT

offline
Опыт: 83,712
Активность:
Гхм, я полагаю что это где-то недочет. В чистом виде все нормально работает. На то он и алгоритм - что бы по коду можно было однозначно определить что и как будет выполняться

NETRAT добавил:
Я к тому что если бы такие вещи не работали стабильно, то мы бы не могли писать скрипты
Старый 25.11.2006, 16:44
dk

offline
Опыт: 60,293
Активность:
Цитата:
вообще, она не сразу должна на четвертый уезжать, а по очереди все проезжать, возможно, такое переключение рождает баг

Просто там дается команда на перемещение за 0 сек. Но для перемещение всеравно требуется какое-то время пусть оно и стремится к 0. А при перемещение в карте используется позиция карты в данное время, поэтому так как первые перемещения еще не успели изменить позицию камеры, то выполняется только третее перемещение. Можно убрать все ифы и оставить только 3 перемещения и камера будет выполнять только 3. Я проверил
Старый 25.11.2006, 18:16
Iron
Листовой
offline
Опыт: 24,427
Активность:
Цитата:
Я к тому что если бы такие вещи не работали стабильно, то мы бы не могли писать скрипты

Я не говорю что они работают не стабильно, я о том что возможно в некоторыхслучаях ониотказывают (стабильно отказывают, т.е. не периодически, а если да, то всегда да, если нет, то всегданет).
Старый 25.11.2006, 21:14
NETRAT

offline
Опыт: 83,712
Активность:
Не думаю что это возможно при "правильном"(когда соображаешь что пишешь) написании триггеров
Старый 25.11.2006, 21:36
DioD

offline
Опыт: 45,134
Активность:
самый распространёный глюк это вынесение одного условия из другого что делает первое условие безполезный а второе никогда не будет выполняться.

надо делать лесенкой ипроблем не будет
Код:
if 
 if
  if
если не первое то второе если не второе то третье

через зеркало это делать

if I!=3
 if I!=2
  if I!=1

да и вообще идти от противного и сконца всегда лучше

Отредактировано DioD, 26.11.2006 в 08:13.
Старый 25.11.2006, 22:01
remal
нечто
offline
Опыт: 2,087
Активность:
пиши на jass и юзай elseif.
Старый 26.11.2006, 04:48
DeathWing

offline
Опыт: 2,557
Активность:
Про баг не знал, спасибо!
Старый 05.12.2006, 15:54
J
expert
offline
Опыт: 48,447
Активность:
DeathWing уже решили что это не баг
Старый 05.12.2006, 15:55
DeathWing

offline
Опыт: 2,557
Активность:
Просто обычно я все посты не читаю, а читаю только статью
Старый 05.12.2006, 16:08

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

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

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

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



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