Структуры vJass
|
|
War-Cry |
Дата: Вторник, 24.11.2009, 15:54 | Сообщение # 1 |
Системный АдминчеГ
Группа: Администраторы
Сообщений: 453
Награды: 14
Статус: Offline
|
Ну я думаю стоит сказать что такое vJass. Это улучшенная версия jass, он имеет новые возможности, например можно использовать блок globals в любом месте кода. Чтобы использовать vJass требуется JassNewGenPack(JNPG), в котором есть компилятор с vJass на обычный Jass. И так приступим. В этой статье я хотел бы вас познакомить со структурами. Структура - это набор переменных. Вот простой пример структуры, в которой хранятся 2 значения. [jass] struct real x real y endstruct [/jass] Вот так описывается раздел структуры. В общем виде он выглядит следующим образом [jass] struct <раздел описания переменных> <раздел описания методов> endstruct [/jass] Чтобы выполнить какое либо действие с переменными структуры нужно использовать конструкцию <структура>.<переменная структуры>. Рассмотрим пример [jass] struct a integer a integer b endstruct function TEST takes nothing returns nothing local a = a.create() // инициалищируем структуру set a.a = 5 //присваиваем значения set a.b = a.a*2+4 set a.a = a.a + a.b endfunction [/jass] Как видите мы используем код a.create(). Что это такое, спросите вы. create - это метод, который создает структуру. Когда мы создаем структуру в неё автоматически закладывается 2 метода (create - создает и destroy - уничтожает). И так что же такое метод? Метод - это функция, которую можно использовать только с определенным типом данных, в нашем случае это со структурой. Методы бывают статичными и динамичными. Давайте рассмотрим 2 метода и найдем сходства и различия [jass] struct A integer a static method sm takes A nashastructyra returns integer return nashastructura.a endmethod method dm takes nothing returns integer return .a endmethod endstruct [/jass] Статичный метод создается как и обычный метод, но он имеет приставку static. Статичный метод может работать только с внешними данными. и вид его использования будет следующим A.sm(<структура>). Заместо запутанных кодов можно использовать this (если написать, вместо nashastructyra, this, то в том методе можно не писать nashastructyra а ставить просто .a. А теперь разберемся с динамичной структурой. Для динамичной структуры можно не указывать в takes структуру. Вместо этого просто нужно при вызове использовать тот же способ что и с переменными. Если вам непонятно, то смотрим пример, ну а если понят, то тоже смотрим пример))) [jass] struct A integer a = 1//так же можно заранее указывать значения method print takes nothing returns integer return .a endmethod function test tekes nothing returns nothing local A lala = A.create() local integer gi = lala.print() set gi = lala.a//это тоже самое что и наш метод, только выполнен через переменную endfunction [/jass] И так с азами мы разобрались. Самое главное в структуры не должны входить динамичные массивы. [jass] struct ArrayTest unit array u [15] endstruct [/jass] В этой структуре мы создали массив юнитов с 15ю значениями. Индексирование (нумерация) массива начинается с 0, поэтому последний элемент массива будет не u[15] а u[14]. Массивы в структурах удобно использовать например для созданий отрядов, и доп. сумок. Но стоит не забывать тот момент, что vJass компилируется на обычный джасс и все элементы такого массива переделаются в обычные переменные. Например Предыдущая структура ArrayTest будет скомпилирована примерно так: [jass] globals ... //structure Array Test unit array str_ArrayTest_u0 unit array str_ArrayTest_u1 unit array str_ArrayTest_u2 unit array str_ArrayTest_u3 unit array str_ArrayTest_u4 unit array str_ArrayTest_u5 unit array str_ArrayTest_u6 unit array str_ArrayTest_u7 unit array str_ArrayTest_u8 unit array str_ArrayTest_u9 unit array str_ArrayTest_u10 unit array str_ArrayTest_u11 unit array str_ArrayTest_u12 unit array str_ArrayTest_u13 unit array str_ArrayTest_u14 ... endglobals [/jass] Поэтому массивы лучше использовать, только в том случае, если у вас строго известен максимальный размер данных, которые можно поместить в массив Ну и на последок рассмотрим пример, для чего это может пригодиться. Допустим нам нужен круглый регион. Структура это что-то типа нового типа))) и так смотрим [jass] struct CircleRect real x//в х и у будем хранить координаты центра окружности real y real radius//а здесь радиус static method New takes real x, real y, real radius returns CircleRect//рассмотрим функцию создания local CircleRect this = CirlceRect.create()//сперва инициализируем структуру set .x = x//а теперь присваиваем значения из локальных переменных в структурные set .y = y set .radius = radius return this endmethod //если вам так и ничего не понятно зачем это надо, то смотрим следующий метод method UnitIn takes unit u returns boolean//эта функция проверяет находится ли юнит u в этой окружности if SqRoot((GetUnitX(u)-.x)*(GetUnitX(u)-.x) + (GetUnitY(u)-.y)*(GetUnitY(u)-.y)) < .radius then //Если расстояние от юнита до центра окружности меньше чем радиус(мы не рассматриваем тот случай, когда юнит находится на линии окружности), значит юнит в этой окружности //SqRoot - точно не помню как пишется return true endif return false endmethod endstruct [/jass] Подведем итоги. Из этой статьи вы узнали что такое vJass, как работать со структурами и что такое методы. Так же мы рассмотрели много различных примеров. Я надеюсь, что это статья вам очень понравилась
|
|
| |
Gam-over_47 |
Дата: Вторник, 24.11.2009, 16:30 | Сообщение # 2 |
Ландер нашей компании
Группа: King Ksel corp
Сообщений: 84
Награды: 8
Замечания: 0%
Статус: Offline
|
Я если чесно нифига не читал тошен мне этот джас ну то что статьи пишешь спасибо сайт движется!
|
|
| |
War-Cry |
Дата: Вторник, 24.11.2009, 16:55 | Сообщение # 3 |
Системный АдминчеГ
Группа: Администраторы
Сообщений: 453
Награды: 14
Статус: Offline
|
Gam-over_47, спасибо тебеДобавлено (24.11.2009, 16:55) --------------------------------------------- Gam-over_47, вот за это ты и внизу))))
|
|
| |
stalker |
Дата: Вторник, 24.11.2009, 20:12 | Сообщение # 4 |
Группа: Модераторы сайта
Сообщений: 191
Награды: 2
Замечания: 20%
Статус: Offline
|
Quote ну то что статьи пишешь спасибо сайт движется! Я согласен с Gam-over_47
|
|
| |
danner |
Дата: Среда, 25.11.2009, 11:55 | Сообщение # 5 |
Группа: Пользователи
Сообщений: 2
Награды: 1
Замечания: 0%
Статус: Offline
|
Насчет того, что в структуры не могут входить массивные значения, я могу поспорить. Туда можно засунуть массив, но задать ему ограничение в количестве, например Code struct A integer array B[8] string array C[91] endstruct и т.д. Чтобы не мучиться с ними(так как тут не динамические массивы), лучше поставить им ограничение 8191 - это максимальное ограничение массива во всей игре, и тогда все будет хорошо. обращаться к ним также, как и с обычными переменными-массивами.
|
|
| |
War-Cry |
Дата: Среда, 25.11.2009, 21:06 | Сообщение # 6 |
Системный АдминчеГ
Группа: Администраторы
Сообщений: 453
Награды: 14
Статус: Offline
|
danner, я разгадал почему в структуре массив ограниченный. Компилятор vJass просто будет создавать нужное кол-во переменных, а потом использовать в конце каждой переменной еще и индекс. Ладно на словах это трудно! Вот пример [jass]//vjass struct gigi integer a array a[4] endstruct //jass globals ... //vjass global variable integer array vjass_struct_gigi_a1 integer array vjass_struct_gigi_a2 integer array vjass_struct_gigi_a3 integer array vjass_struct_gigi_a4 ... endglobals[/jass] Так что если там поставить 8191 то это будет создаваться 8191 переменная и думаю это сильно загрузит память вара, и время загрузки станет дольше. Сам проверял)))))
|
|
| |
danner |
Дата: Среда, 25.11.2009, 22:04 | Сообщение # 7 |
Группа: Пользователи
Сообщений: 2
Награды: 1
Замечания: 0%
Статус: Offline
|
ну так это если не знаем, сколько необходимо переменных массива. а когда узнаем, то естественно лишние убрать легче будет P.S. а что насчет глобальных, приватных и публичных структур? а также и интерфейсов, так как из структур можно создать интерфейс?
Сообщение отредактировал danner - Среда, 25.11.2009, 22:06 |
|
| |
War-Cry |
Дата: Четверг, 26.11.2009, 12:31 | Сообщение # 8 |
Системный АдминчеГ
Группа: Администраторы
Сообщений: 453
Награды: 14
Статус: Offline
|
danner, с этим я особо не разбирался и знаю их не очень хорошо
|
|
| |