Логин:
Пароль:

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: MaHBe  
Форум » WarCraft3 » Статьи » Структуры vJass
Структуры 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, как работать со структурами и что такое методы. Так же мы рассмотрели много различных примеров. Я надеюсь, что это статья вам очень понравилась wink


 
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, с этим я особо не разбирался и знаю их не очень хорошо


 
Форум » WarCraft3 » Статьи » Структуры vJass
  • Страница 1 из 1
  • 1
Поиск:




Дизайн сайта разработан war-cry
Спасибо пользователям Gam-Over_47,MaHBe и stalker за помощь в развитии сайта
При копировании материалов с нашего сайта, вы обязаны указать ссылку на наш сайт, иначе вы нарушаете авторские права, установленные владельцем сайта
Copyright King Ksel corp © 2008 - 2024
Хостинг от uCoz