|
|
|
|
Jass для GUIшников.
|
|
Dreii | Дата: Вторник, 29 Марта 2011, 10:18:41 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| СТАТЬЯ ДЛЯ ГУИШНИКОВ – Учимся JASS’у немного отсебятины: Я знаю что такого велосипеда навалом. И может быть я что то плохо или не так описал. Но думаю для новичка,который только что слез с гуи, статья будет полезна. Хоть и не много. Введение: Обойдемся бескрасочных фраз, ведь мы хотим научиться делать удивительные вещи на Jass! И так, если ты читаешь эту статью, то ты должен иметь несколько вещей: -Нужно иметь Warcraft 3 Frozen Thorn v1.24+ -Скачать и установить JNGP -Иметь знания триггеров -Логическое мышление (Хотя хз, можно и без него) -Мозг Мы приобрели эти легкие вещи и хотим начать изучать JASS!!! Строение триггера: Также как и на ГУИ, Jass состоит из Событий, Условий и Действий. Но расположено это снизу вверх: в самом низу должна быть функция создания триггера, в который присоединяются действия условия, а также события. Рассмотрим на примере Есть такой триггер Code Событие ---Боевая единица-Событие Приводит способность в действие Условие ---(Применяемая способность) равно Гальванизация Действия ---Боевая единица – Убить (Переключающийся юнит) Назовем его Lesson. Теперь превратим его в текст «Правка – Конвертировать в текст» (Вернуть обратно можно, нажав Ctrl+Z) Code function Trig_Lesson_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'AUan' ) ) then return false endif return true endfunction function Trig_Lesson_Actions takes nothing returns nothing call KillUnit( GetTriggerUnit() ) endfunction
//=========================================================================== function InitTrig_Lesson takes nothing returns nothing set gg_trg_Lesson = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Lesson, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition( gg_trg_Lesson, Condition( function Trig_Lesson_Conditions ) ) call TriggerAddAction( gg_trg_Lesson, function Trig_Lesson_Actions ) endfunction -функция условий -функция действий -функция событий Для вас это всего лишь простой набор букв, так что разберем все по порядку . Событие Code function InitTrig_Lesson takes nothing returns nothing set gg_trg_Lesson = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Lesson, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition( gg_trg_Lesson, Condition( function Trig_Lesson_Conditions ) ) call TriggerAddAction( gg_trg_Lesson, function Trig_Lesson_Actions ) endfunction - InitTrig_Lesson – Название триггера Code set gg_trg_Lesson = CreateTrigger( ) Создание триггера здесь он сразу привязывается к переменной gg_trg_Lesson Code call TriggerAddCondition( gg_trg_Lesson, Condition( function Trig_Lesson_Conditions ) ) Добавляет к нашему триггеру условия(Привязывается функция с событием) Code call TriggerAddAction( gg_trg_Lesson, function Trig_Lesson_Actions ) Добавляет к нашему триггеру функцию с действием Условия Code function Trig_Lesson_Conditions takes nothing returns Boolean if ( not ( GetSpellAbilityId() == 'AUan' ) ) then return false endif return true endfunction Это стандартное условие при конвертации в текст : если не наша способность то нет, иначе да, Если функция условий возвращает правду, запускается функция действий Действия Code function Trig_Lesson_Actions takes nothing returns nothing call KillUnit( GetTriggerUnit() ) endfunction Здесь между function и endfunction могут быть действия В данном случае у меня стоит убийство юнита Code call KillUnit( GetTriggerUnit() ) call – вызов ф-ии -Убить юнита и в скобках указывается юнит - Это юнит который срабатывает на событие Ну, вот я думаю, вы все поняли. Если нет спрашивайте) О функциях: Каждая функция может принимать и возвращать значения, а может этого и не делать, как функции триггера выше (takes nothing returns nothing) Каждое действие из редактора триггеров – функция, в которую передаются значения. Вызывается по такому принципу: Code call <название функции>( ) После вызова и названия функции в скобках указываются значения, которые она принимает, через запятую. Типы передаваемых значений должны соответствовать типам, указанным после слова takes, но названия могут быть разными. Функция Мгновенного перемещения юнита не имеющая аналогов на ГУИ Code SetUnitPosition takes [color=red]unit[/color] [color=purple]whichUnit[/color], [color=red]real[/color] [color=purple]newX[/color],[color=red] real[/color] [color=purple]newY[/color] returns nothing - Красным отмечены типы, фиолетовым –названия Операторы Code set = – присвоение, например: set int=20. Так же можно задавать значения прямиком из функции, например: set unit = CreateUnit( Player(0), ‘h000’, 0., 0., 0. )
// - комментарий, всё что после него ни на что кроме читателя не влияет
return – возврат значения * return прерывает функцию, и все действия, стоящие ниже него, будут пропущены
+ - / * - сложение вычитание деление умножение
' ' – конвертирует символы внутри, если их 4 – не иначе. '1234' == 825373492 " " – конвертирует символы внутри в строку.
Условия: if … then //между if и then помещается утверждение, которое нужно выяснить … //действия в случае выполнения вышестоящих условий elseif … then //иначе если, недоступный на гуи оператор … else … endif //завершение блока условий
and or not – “и” “или” “не”
Можно обходиться и без иначе, например: if … then … endif
Операторы сравнения: == - равно, не путать с присвоением “=” > - больше < - меньше >= - больше или равно <= - меньше или равно != - не равно
Задание локалок: local – задает локальную переменную по такому принципу: local <type> <name> = <count> //Например, так: local integer i = 2 * Задавать значение сразу необязательно
Циклы: loop //начало цикла exitwhen … //условие выхода из него … //действия внутри цикла endloop //конец блока цикла
Пример: set i = 2 loop exitwhen i > 8 … set i = i + 2 endloop - Этот цикл сработает 4 раза и после его завершения i примет значение «10», где i – локальная переменная типа integer, но о локалках позже. * на джасcе в цикле можно сделать любое условие, и изменять его как угодно
call – вызов функции
constant – добавляется к функции, чтобы сделать возвращаемое ею значение константой. Пример: constant function MapAreaSize takes nothing returns real return 16777216. endfunction - если вам лень запоминать число или другой объект, можно запомнить название функции и получить его, это так же может сэкономить длину кода. Пример: set size=MapAreaSize() //переменная size приняла значение 16777216. Переменные В Jass существует 2 вида переменных - локальные и глобальные. Разберём плюсы и минусы каждого из них. Локальные: + Сохраняют своё значение после ожиданий. + Создаются уникально при каждом запуске триггера (не перезаписываются после второго запуска триггера). + Легко регулируемы. + MUI. - Действуют только в пределах функции, где их задали. Глобальные: + Действуют во всех триггерах карты. +- MPI (Хоть и массивным способом) - Есть риск потерять значение после ожидания (Если триггер запустится во время ожидания, переменная перезапишется). - Каждый раз нужно писать приставку udg_ - Немного неудобны по сравнению с локальными. Лучше использовать ТОЛЬКО локальные переменные(Хеш-таблицы исключение) Как объявить локальную переменную Code local <тип> <название> Например Где integer – тип переменной (Целочисленая) i-Имя нашей переменной по которой ее можно вызвать,например Также при создании переменной можно сразу задать ей значение Code local <тип> <название> = <значение> Например Тогда наша целочисленная будет равна 10 Также можно задать переменную по ходу кода Например Подобным образом задают глобальные переменные, но добавляют приставку udg_ Code set udg_<название> = <значение> Например: Глобальные переменные создаются в Редакторе переменных, локальные же - только в функциях Переменные бывают утечные (те, которые наследуются от типа handle), их надо обнулять: Вот несколько типов переменных Code hashtable handle real integer event player widget unit destructable item ability b uff force group trigger triggercondition triggeraction timer location region Работа с кодом. Наш код, который показан в примере выглядит некрасиво Давайте приведем его к хорошему виду. Начнем с условий Code function Trig_Lesson_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'AUan' ) ) then return false endif return true endfunction Приведем к такому виду Code function Trig_Lesson_Conditions takes nothing returns boolean return GetSpellAbilityId() == 'AUan' then endfunction Видите, как сократилось? Также убрались эти некрасивые скобки(Скобки лучше убирать,но только в тех случаях где они не играют важных ролей) Например нам нужно поставить условие на уровень способности. Если уровень способности равен 4-5-9-10 то делать наши действия Можно сделать так Code return GetUnitAbilityLeve (unit,'AUan') ==4 or GetUnitAbilityLevel (unit,'AUan') ==5 or GetUnitAbilityLevel (unit,'AUan') ==9 or GetUnitAbilityLevel (unit,'AUan')==10 Громоздко,лучше сделать так Создадим локальную переменную lvl Code local integer lvl= GetUnitAbilityLevel (unit,'AUan') if lvl==4 or lvl ==5 lvl ==9 or lvl ==10 then //Действия endif
Сообщение отредактировал Dreii - Вторник, 29 Марта 2011, 10:20:18 |
|
|
|
Toycupo | Дата: Вторник, 29 Марта 2011, 11:09:05 | Сообщение # 2 |
6 уровень
Группа: Проверенные
Сообщений: 242
Награды: 0
Репутация: 38
Блокировки:
| мммм статья от Dreii это уже хорошо. Надо будет потом поучится. Триггеры бы только доучить)
Сообщение отредактировал Toycupo - Вторник, 29 Марта 2011, 11:09:26 |
|
|
|
Vova5009 | Дата: Вторник, 29 Марта 2011, 15:27:19 | Сообщение # 3 |
8 уровень
Группа: Проверенные
Сообщений: 577
Награды: 0
Репутация: 125
Блокировки:
| Dreii, неплохо, но Quote (Dreii) Code SetUnitPosition takes [color=red]unit[/color] [color=purple]whichUnit[/color], [color=red]real[/color] [color=purple]newX[/color],[color=red] real[/color] [color=purple]newY[/color] returns nothing Мда... Строки вон из Code. Затем, раз уж затронул jass сказал бы пару слов про Hash таблицы. И к сожалению ни 1 Гуишник(за редким исключением) не будет читать столько совершенно не оформленного текста! Ну и еще потому, что народ любит яркие картинки а не унылый белый текст)
|
|
|
|
Dreii | Дата: Вторник, 29 Марта 2011, 15:35:53 | Сообщение # 4 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Vova5009, не люблю расскрашивать
|
|
|
|
Manko_O | Дата: Вторник, 29 Марта 2011, 16:51:19 | Сообщение # 5 |
7 уровень
Группа: Проверенные
Сообщений: 296
Награды: 0
Репутация: 23
Блокировки:
| Quote (Dreii) -функция событий Думаю тут правильней инициализация триггера. Quote (Dreii) Например Codelocal integer i Опять же. Лучше сразу инициализировать переменную. Но по такой статье сложно будет учиться. Всё описано очень кратко.
|
|
|
|
Dreii | Дата: Вторник, 29 Марта 2011, 16:52:46 | Сообщение # 6 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Manko_O, понятно что сразу. Просто показываю....
|
|
|
|
GraF251996 | Дата: Вторник, 29 Марта 2011, 17:05:43 | Сообщение # 7 |
8 уровень
Группа: Проверенные
Сообщений: 756
Награды: 1
Репутация: 321
Блокировки:
| О,спс большое.
12Gb RAM 1333@1600 | AMD Phenom II x4 B50 3.1Ghz@3.70Ghz | Asus Xonar D1 | Asus GTX560Ti 1Gb GDDR5 820Mhz@965Mhz | Asus VW225N
|
|
|
|
lawson | Дата: Вторник, 29 Марта 2011, 17:50:10 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Dreii) Всё описано очень кратко. !!! Есть такие статьи на xgm но там она старая. А если честно то это просто пересказ той статьи что на xgm просто более новее. Сам не читал такие статьи учился методом тыка. Я ту статьи еле дочитал хотя я ни чего из нее не понял только как триггер перевести в текст, а эта еще сложнее.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Вторник, 29 Марта 2011, 17:51:32 |
|
|
|
LanceloTo | Дата: Вторник, 29 Марта 2011, 20:29:21 | Сообщение # 9 |
4 уровень
Группа: Проверенные
Сообщений: 94
Награды: 0
Репутация: 6
Блокировки:
| Dreii, я перечитал эту статью уже раза четыре где то.. И вот что странно: Я так и не научился Jass'у, имея те знания которые ты преподал только что Нет ли более углубленной статейки?)
|
|
|
|
lawson | Дата: Вторник, 29 Марта 2011, 20:36:11 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (LanceloTo) Я так и не научился Jass'у А что ты пордазумеваешь под словон научился? Хмм. Ты что думал прочитать статью и ты сразу станешь JASS'ером?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
LanceloTo | Дата: Вторник, 29 Марта 2011, 20:46:40 | Сообщение # 11 |
4 уровень
Группа: Проверенные
Сообщений: 94
Награды: 0
Репутация: 6
Блокировки:
| Quote (lawson) Ты что думал прочитать статью и ты сразу станешь JASS'ером? Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » Jass для GUIшников. (Осваиваем Jass за 12 часов.) СТАТЬЯ ДЛЯ ГУИШНИКОВ – Учимся JASS’у Вот, что я имел ввиду)) Я не смог научится джассу через эту статью, хоть и все запомнил и ДАЖЕ понял)))
|
|
|
|
lawson | Дата: Вторник, 29 Марта 2011, 20:47:50 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (LanceloTo) Я не смог научится джассу Quote (LanceloTo) А что ты пордазумеваешь под словон научился? Хмм. Ты что думал прочитать статью и ты сразу станешь JASS'ером? Ястно почему ты не научился. Прочитай сообщение мое внимательней. Сколько я не читал эти статьи а все равно ни чего с них не вынес, даже как пользоватсья хешом я научился только после того как в наработке Dreii "Вокрешение" я увидел не понятные не высвеченные функции, потом я методом тыка применил их в другом триггере и работало потом еще и еще практиковался(можешь посмотреть я ни одной темы не создавал где б я писал Помогите с хешом я его не понимаю) вот так и узнал что из себя представляет хеш. Для этого я использовал МОЗГ самое главное состовляющее и упорство. А так если ты думаешь вот есть статья прочитаю и буду знать то так не выйдет. Учись на практике конвертони обычный триггер(не сложный) и посмотри как оно для начала выглядит на JASS. Сделай триггер чтоб при истечении времени игроку давалось 2000 золота потом конвертони его и посмотри что из этого получилось.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Вторник, 29 Марта 2011, 20:54:55 |
|
|
|
Murador | Дата: Вторник, 29 Марта 2011, 20:49:52 | Сообщение # 13 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| Dreii, кстати вопрос, зачем нужен тип boolexpr ?
|
|
|
|
lawson | Дата: Вторник, 29 Марта 2011, 20:52:34 | Сообщение # 14 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Murador) зачем нужен тип boolexpr ? Для проверки отдельных условий, условий которые возвращает только true или false.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Вторник, 29 Марта 2011, 21:03:01 |
|
|
|
LanceloTo | Дата: Вторник, 29 Марта 2011, 20:55:52 | Сообщение # 15 |
4 уровень
Группа: Проверенные
Сообщений: 94
Награды: 0
Репутация: 6
Блокировки:
| lawson, что я всегда и делаю (в любой ситуации) Мое сообщение имело смысл - "Прочитал, оценил"
|
|
|
|
lawson | Дата: Вторник, 29 Марта 2011, 20:57:34 | Сообщение # 16 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (LanceloTo) что я всегда и делаю (в любой ситуации) А на первый взгляд так не скажешь. Как будто все надежды только на статьи.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Murador | Дата: Вторник, 29 Марта 2011, 21:00:15 | Сообщение # 17 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| lawson, эмм а разве не в любом случае условие будет возвращать true\false? Добавлено (29-03-2011, 21:00) --------------------------------------------- исходя из твоей логики можно проделывать такие действия Code if i!=1 then returns i
|
|
|
|
lawson | Дата: Вторник, 29 Марта 2011, 21:02:29 | Сообщение # 18 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Murador, Имелось ввиду что будет возвращать boolean function lll takes nothing returns boolean return #### endfunction Добавлено (29-03-2011, 21:02) --------------------------------------------- Quote (Murador) if i!=1 then returns i В данном случае ты возвращаешь Integer или real. Ты забыл только endif
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Вторник, 29 Марта 2011, 21:09:56 |
|
|
|
LanceloTo | Дата: Вторник, 29 Марта 2011, 21:04:02 | Сообщение # 19 |
4 уровень
Группа: Проверенные
Сообщений: 94
Награды: 0
Репутация: 6
Блокировки:
| lawson, статья для того и пишется, что бы дать знания. Но натыкаясь на статьи, лучше лишний раз почитать. К примеру без статьи "Локальные переменные" я бы не узнал что такое локальные переменные. Благодаря им я смог > увидеть джасс > найти совпадения с гуи > сделать для себя выводы. Разве ты не пользуешься статьями, для получения лишних знаний?
|
|
|
|
lawson | Дата: Вторник, 29 Марта 2011, 21:05:45 | Сообщение # 20 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (LanceloTo) Разве ты не пользуешься статьями, для получения лишних знаний? Если ты о жизни то конечно пользуюсь. А если ты о JASS то нет я пытался читать статьи и здесь и на xgm ни че не понял. Решил изучать сам методом тыка.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
LanceloTo | Дата: Вторник, 29 Марта 2011, 21:14:49 | Сообщение # 21 |
4 уровень
Группа: Проверенные
Сообщений: 94
Награды: 0
Репутация: 6
Блокировки:
| lawson, я говорил про "вообще" Статьи для того и писаны) А проблема этой статьи на языке программирования будет звучать как: (Название) =! (Содержание)
|
|
|
|
lawson | Дата: Вторник, 29 Марта 2011, 21:17:58 | Сообщение # 22 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| не =! а !=
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
LanceloTo | Дата: Вторник, 29 Марта 2011, 21:24:05 | Сообщение # 23 |
4 уровень
Группа: Проверенные
Сообщений: 94
Награды: 0
Репутация: 6
Блокировки:
| lawson, извиняюсь
|
|
|
|
Dreii | Дата: Вторник, 29 Марта 2011, 22:10:49 | Сообщение # 24 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Quote (Murador) зачем нужен тип boolexpr Хз,он мне не нужен. Ну думаю для филььтрации)) Code native GroupEnumUnitsInRangeOfLoc takes group whichGroup, location whichLocation, real radius, boolexpr filter returns nothing
|
|
|
|
Murador | Дата: Вторник, 29 Марта 2011, 22:12:40 | Сообщение # 25 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| lawson, кстати какие значения принимает boolexpr?
|
|
|
|
|
|
|
|
|
|
|