Сейчас 18:11:00 Пятница, 22 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
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 – вызов ф-ии
Code
KillUnit(UNIT)
-Убить юнита и в скобках указывается юнит
Code
GetTriggerUnit()
- Это юнит который срабатывает на событие
Ну, вот я думаю, вы все поняли. Если нет спрашивайте)
О функциях:
Каждая функция может принимать и возвращать значения, а может этого и не делать, как функции триггера выше (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 <тип> <название>

Например
Code
local integer i

Где integer – тип переменной (Целочисленая)
i-Имя нашей переменной по которой ее можно вызвать,например
Code
set i=i+1

Также при создании переменной можно сразу задать ей значение
Code
local <тип> <название> = <значение>

Например
Code
local integer i=10

Тогда наша целочисленная будет равна 10
Также можно задать переменную по ходу кода
Code
set <имя>=<значение>

Например
Code
set i=15

Подобным образом задают глобальные переменные, но добавляют приставку udg_
Code
set udg_<название> = <значение>

Например:
Code
set udg_integer = 0

Глобальные переменные создаются в Редакторе переменных, локальные же - только в функциях
Переменные бывают утечные (те, которые наследуются от типа handle), их надо обнулять:
Code
set u=null

Вот несколько типов переменных
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

Опять же. Лучше сразу инициализировать переменную.
Code
local integer i = 0

Но по такой статье сложно будет учиться. Всё описано очень кратко.

 

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?
 

  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz