Добавлен GetLocalPlayer,
опубликован
vJass
Содержание:
Содержание главы:
Двумерные массивы
vJass позволяет вам объявлять двумерные массивы.
globals
integer array test[8][10]
endglobals
Обратите внимание, что это лишь имитация двумерного массива, основанная на использовании обычного Jass-массива со смещением. Это означает, что вы ограничены в размерности, которую можете задать двумерному массиву, поскольку массивы в Jass ограничены размером в 8192 ячейки. Так например, в примере выше, мы объявили двумерный массив test, которому JassHelper резервирует 8*10 ячеек обычного Jass-массива, в который развертывается.
Тип-массив
Прим. пер.: в оригинале это дело именуется "dynamic arrays", что может ввести в заблуждение, посему я посмел выбрать иное определение.
vJass позволяет объявлять особую разновидность массива, которая может быть использована в качестве нового типа данных. Это дает возможность использовать массивы подобно обычным переменным - передавать их в качестве аргумента функции, указывать как возвращаемое значение и т.д.
При объявления типа-массива вы должны явно указывать его размерность.
Тип-массив развертывается в обычный Jass-массив, что накладывает ограничение на количество экземпляров одного типа. То есть, если вы объявили тип-массив размерностью 100, вы сможете создать только 81 экземпляр этого типа. Если вы попытаетесь создать экземпляр типа-массива, превысив максимальное число экземпляров этого типа, конструктор вернет значение 0, а в игре будет выведено предупреждение на экран.
В целом, поведение типа-массива схоже с поведением структур. Для создания экземпляра вы так же должны обратиться к методу create, а более ненужный экземпляр необходимо уничтожать вызовом метода destroy.
Обращение к ячейке типа-массива происходит посредством оператора [] подобно обычному массиву.
Синтаксис объявление типа массива следующий
type <ИмяТипа> extends <базовыйТип> array[<размер>]
где <размер> - целоче число или глобальная константа.
Продемонстрируем вышесказанное на простом примере
type MyArray extends integer array[8]
function GetArrayInstance takes nothing returns MyArray
local MyArray tmp = MyArray.create()
local integer i = 0
loop
exitwhen i == MyArray.size // Размер массива
set tmp[i] = i
set i = i + 1
endloop
return tmp
endfunction
function Test takes nothing returns nothing
local MyArray tmp = GetArrayInstance()
local integer i=0
loop
exitwhen i == MyArray.size
call BJDebugMsg(I2S(tmp[i]))
set i = i + 1
endloop
call tmp.destroy()
endfunction
Пример выше так же демонстрирует атрибут size. Это атрибут присущий любому типу-массиву и позволяет узнать размерность, с которой этот тип был объявлен.
Вы так так же можете объявлять тип-массив от любого пользовательского типа - структура, интерфейс, другой тип-массив. В случае объявления типа-массива от другого типа-массива, мы получаем объект с поведением многомерного массива. Это позволяет реализовать, например, матрицы
type MyArray extends integer array[3]
type Matrix extends MyArray array[3]
function GetMatrix takes nothing returns Matrix
local Matrix tmp = Matrix.create()
local integer i = 0
local integer j
loop
exitwhen i == Matrix.size
set tmp[i] = MyArray.create()
set j = 0
loop
exitwhen j == MyArray.size
set tmp[i][j] = j*i
set j = j + 1
endloop
set i = i + 1
endloop
return tmp
endfunction
function Test takes nothing returns nothing
local Matrix mat = GetMatrix()
local integer i = 0
local integer j
local string s
loop
exitwhen i == mat.size
set j = 0
set s = ""
loop
exitwhen j == mat[i].size
set s = s + I2S(mat[i][j]) + " "
set j = j + 1
endloop
call BJDebugMsg(s)
set i = i + 1
endloop
call mat.destroy()
endfunction
Аргументы структуры так же могут иметь тип-массив
type MyArray extends integer array [20]
struct stack
private MyArray arr
/*
Прочий код...
*/
endstruct
Массив структуры
Порой у вас может появиться желание заиметь готовый глобальный массив типа структуры. Возможно, необходим набор уже готовых экземпляров какой-то структуры, без постоянного вызова конструктора и деструктора. Массив структуры, это небольшое синтаксическое усиление, что избавит от необходимости постоянного вызова конструктора
struct playerdata extends array // Синтаксис объявления массива структуры
integer a
integer b
integer c
endstruct
function init takes nothing returns nothing
local playerdata pd
set playerdata[3].a=12
set playerdata[3].b=34
set playerdata[3].c=500
set pd=playerdata[4]
set pd.a=17
set pd.b=111
set pd.c=501
endfunction
function updatePlayerStuff takes player p returns nothing
// Какая-то случайная функция
local integer i=GetPlayerId(p)
set playerdata[i].a=playerdata[i].b
endfunction
Пара замечаний при работе с массивом структуры:
- Вы не можете инициализировать атрибуты массива структуры (им будут автоматически установлены значения 0 или null)
- Вы не можете определить деструктор (это было бы бессмысленно)
- Вы не можете вызвать allocate и destroy методы
- Массив структуры не может иметь атрибуты-массивы
Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован PT153
Отредактирован GetLocalPlayer