|
|
|
|
Заметки начинающим кодерам
|
|
[DUОS] | Дата: Суббота, 03 Декабря 2011, 17:10:09 | Сообщение # 1 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
|
Внимание! Если вдруг при сохранении WE закрылся с ошибкой, то весь код сохраняемой карты можно найти в папке <ИмяКарты>Temp, находящейся по тому же адресу, куда карта сохранялась. После этого в оставшейся версии карты можно выполнить команду Файл -> Импорт триггеров и внести все триггеры из некорректно сохранённой карты. Возьмите на заметку - некоторые сгенерированные Редактором переменные придётся пересоздать. Если вы беспокоитесь, что карта не сохранится, очень советую использование этого скрипта, который сделает резервную копию карты.
Возможные баги:
- Вылет из-за отсутствия endif'ов и endloop'ов. Если в карте есть синтаксически незавершённые циклы или условия, то при её сохранении WE закроется с ошибкой. Будьте предельно внимательны, когда строите условие или цикл.
- Неверно написанные целочисленные вызывают вылет. Неверные значения целочисленных, к примеру, равкоды, также вызывают вылет Редактора при сохранении. Допустим, 'ОЛОЛОЛОЛО' вызовет вылет, когда 'Arav' - значение допустимое. Идентично предыдущему - будьте очень внимательны!
- Использование одиночных слэшей вместо двойных вызывает вылет. Если вы хотите, чтобы строка содержала символ \, то используйте \\, так как одинарный слэш - служебный символ.
- Функция, которая должна что-то возвращать, но не возвращает этого, вызывает вылет.
- Положение подсветки ошибок в парсере находится на линию ниже. Известный баг парсера, который, правда, ничем не фиксится.
- Лимит символов в строке. Строки, которые содержат более 860 символов, вызывают вылет Редактора при сохранении карты. У этого бага есть решение - используйте конкатенацию строк.
- Переменные с одинаковыми названиями будут друг друга перезаписывать. Такой баг может стать достаточно назойливым. Допустим, если у вас есть принимаемый функцией параметр и локальная переменная, названные одинаково, то свою ссылку сохранять будет только локальная переменная. Тогда код может повести себя, мягко говоря, нехорошо. Но этот баг может оказаться для нас полезным, например, когда GUI нужно сделать MUI (в чётко определённых случаях).
- Лимит на Custom Script на некоторых ОС. Этот баг можно преодолеть, занеся все функции в один триггер, который скомпилируется раньше других.
- Windows XP with Service Pack 2 vs. Windows XP без SP2. Один из самых идиотских багов. На этих ОС Редактор и десинхронизации ведут себя по разному.
- Знак процента убирается при компиляции. Если у вас такое случилось (такое случается только в зоне Custom Script - над всеми триггерами), тогда следует поставить %%, вместо одиночного %.
- Звуки не проигрываются с первого раза. При первом проигрывании звука Jass его "прогружает", а при дальнейших будет воспроизведение.
Баги native-функций:
- Лимит на количество Gamecache. Существует бородатый баг, который не позволяет создавать более 256 глобальных кэшей.
- Уничтоженные таймеры не останавливаются. Если таймер уничтожается в отличающейся от callback функции этого таймера, то он может порой не остановиться. Решение проблемы - сначала ставить таймер на паузу, а уже потом уничтожать.
- SetUnitX и SetUnitY могут вызывать вылеты. Если новые координаты находятся за пределами ректа bj_mapInitialPlayableArea, тогда фатал обеспечен. Проверяйте, что новые координаты находятся в пределах bj_mapInitialPlayableArea, если хотите, чтобы баг на Вашу карту не распространился.
- CreateUnit может вызывать вылеты. Такая же история, как и выше. Если юнита создать за пределами ректа bj_mapInitialPlayableArea, то игра просто сыграет в "бутылочку"... Решение проблемы такое же.
- RestoreUnit игнорирует защиту от тайпкастинга. Чтобы избежать вылета, будьте поаккуратнее с хендлом этого юнита...
- GroupEnumUnitsInRectCounted и GroupEnumUnitsInRangeCounted порой ведут себя нехорошо. Они неправильно считают большое кол-во боевых единиц. Ищите лучше другой путь посчитать их.
- Использование ForForce в callback-функции другого ForForce вызовет проблему. Смотрите сами на код:
Code function X3 takes nothing returns nothing call BJDebugMsg("2") endfunction
function X2 takes nothing returns nothing call BJDebugMsg("1") call ForForce(udg_f, function X3) call BJDebugMsg("3") endfunction
function X1 takes nothing returns nothing call ForceAddPlayer(udg_f, Player(0)) call ForceAddPlayer(udg_f, Player(1)) call ForForce(udg_f, function X2) endfunction По идее должен вывестись текст 1, 2, 2, 3, 1, 2, 2, 3, на деле же выводит 1, 2, 2, 3, 2. - GetExpiredTimer() тоже может провоцировать вылет игры. Никогда не делайте что-то подобное:
Code function Trig_Melee_Initialization_Actions takes nothing returns nothing call GetExpiredTimer() endfunction
//=========================================================================== function InitTrig_Melee_Initialization takes nothing returns nothing set gg_trg_Melee_Initialization = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Melee_Initialization, EVENT_PLAYER_UNIT_DEATH ) call TriggerAddAction( gg_trg_Melee_Initialization, function Trig_Melee_Initialization_Actions ) endfunction Если умирающая боевая единица контролируется компьютером, тогда игра вылетит. Впрочем, если им играет человек - всё нормально.
Сообщение отредактировал [DUОS] - Понедельник, 05 Декабря 2011, 18:54:20 |
|
|
|
Hexing | Дата: Суббота, 03 Декабря 2011, 17:30:14 | Сообщение # 2 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
| пофикси, самого бесит - копипаст из редактора = каракули Quote (|DUОS|) Использование одиночных слэшей вместо двойных вызывает вылет. Если вы хотите, чтобы строка содержала символ \, то используйте \\, так как одинарный слэш - служебный символ. ничего ужасного не произойдёт - будет обычная ошибка(у меня в jngp так) Quote (|DUОS|) Лимит на Custom Script на некоторых ОС. Этот баг можно преодолеть, занеся все функции в один триггер, который скомпилируется раньше других. поподробнее пожалуйста
в целом полезный топик...
|
|
|
|
SirNikolas | Дата: Суббота, 03 Декабря 2011, 18:25:38 | Сообщение # 3 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (|DUОS|) Допустим, если у вас есть принимаемый функцией параметр и локальная переменная, названные одинаково Насколько я знаю, WE в таком случае вылетает, а JNGP выдает ошибку. Это локалками можно перезаписывать глобалки.
|
|
|
|
DragoN | Дата: Воскресенье, 04 Декабря 2011, 01:42:42 | Сообщение # 4 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| Quote (|DUОS|) Лимит символов в строке. Строки, которые содержат более 860 символов, вызывают вылет Редактора при сохранении карты. У этого бага есть решение - используйте конкатенацию строк. тут two-side problem появляется: по сути правильно максимальное число особо не выделишь. максимальный размер строки 1023 байта. в это время все ASCII-символы занимают один байт, остальные – два байта Quote (|DUОS|) Звуки не проигрываются с первого раза. При первом проигрывании звука Jass его "прогружает", а при дальнейших будет воспроизведение. preload в функции инициализации триггера должен по логике в таком случае спасать по сути большинство описываемых ошибок ловит jasshelper из jngp и не даёт в большинстве случаев скрашить карту
El Psy Congroo
|
|
|
|
[DUОS] | Дата: Воскресенье, 04 Декабря 2011, 17:50:16 | Сообщение # 5 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (DragoN) preload в функции инициализации триггера должен по логике в таком случае спасать Прелоад спасает в таком случае, более того. Quote (DragoN) тут two-side problem появляется: по сути правильно максимальное число особо не выделишь. максимальный размер строки 1023 байта. в это время все ASCII-символы занимают один байт, остальные – два байта По логике да. В среднем лучше не превышать 860. Quote (DragoN) по сути большинство описываемых ошибок ловит jasshelper из jngp и не даёт в большинстве случаев скрашить карту Это совершенно не отменяет необходимость их знать. Но и жнгп крашиться умеет
|
|
|
|
DragoN | Дата: Воскресенье, 04 Декабря 2011, 18:20:03 | Сообщение # 6 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| Quote (|DUОS|) Это совершенно не отменяет необходимость их знать. Но и жнгп крашиться умеет он крашится от таких проблем от силы в 5-10% случаев
El Psy Congroo
|
|
|
|
SirNikolas | Дата: Понедельник, 05 Декабря 2011, 11:52:16 | Сообщение # 7 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (DragoN) он крашится от таких проблем от силы в 5-10% случаев Меньше. Я умудрился повесить его один раз, когда раз пять подряд сохранил карту с ошибкой, ничего не исправляя в ней.Quote (|DUОS|) Но и жнгп крашиться умеет Quote (|DUОS|) очень советую использование этого скрипта, который сделает резервную копию карты. Добавлено (05 Декабрь 2011, 11:52:16) ---------------------------------------------
Quote (SirNikolas) Я умудрился повесить его один раз Правда, он тогда и карту стер.
|
|
|
|
[DUОS] | Дата: Понедельник, 05 Декабря 2011, 18:54:36 | Сообщение # 8 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Дополнил.
|
|
|
|
SirNikolas | Дата: Пятница, 03 Февраля 2012, 13:43:59 | Сообщение # 9 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| - Если создать глобальную переменную типа region (в vJASS) и сразу же присвоить ей значение CreateRegion(), при использовании для нее следующих функций:
Code native RegionAddRect takes region whichRegion, rect r returns nothing native RegionClearRect takes region whichRegion, rect r returns nothing
native RegionAddCell takes region whichRegion, real x, real y returns nothing native RegionAddCellAtLoc takes region whichRegion, location whichLocation returns nothing native RegionClearCell takes region whichRegion, real x, real y returns nothing native RegionClearCellAtLoc takes region whichRegion, location whichLocation returns nothing будет Fatal error. Найдено DiabFall'ом.Добавлено (03 Февраль 2012, 13:43:59) --------------------------------------------- Фиксится созданием региона при ините.
|
|
|
|
lawson | Дата: Пятница, 03 Февраля 2012, 14:24:32 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (SirNikolas) будет Fatal error. Давно заметил когда делал рандомный переход по ректам, хмм а я так и не доделал решил что сделал все не правильно.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 03 Февраля 2012, 14:25:06 |
|
|
|
|
|
|
|
|
|
|