Конечно, оно может меняться, но значение всегда одно.
В случае с массивом вы можете записывать несколько значений в одну переменную под разными индексами. И получить доступ к каждому значению индивидуально, используя действия и выражения в редакторе событий.
Массив может хранить как числовые так строковые значения, но один массив не может одновременно хранить и числа и текст. Вы должны выбрать тип массива в свойствах объекта Array.
Добавить число или строку в объект Array
Что бы записать какую либо переменную в массив вы должны воспользоваться следующими действиями:
можно использовать до 3-х измерений (X, Y и Z). Эти измерения являются как бы индексами того или иного значения.
Для чисел
- Write value to X — это действие записывает значение в массив с одним измерением X. Вы должны указать значение, которое хотите вписать, а так же вы должны указать индекс X, под которым будет храниться данное значение.
- Write value to XY — это действие записывает значение в двух измерениях массива. Он просит указать индексы X и Y, чтобы записать значение.
- Write value to XYZ — это действие работает только для трехмерного массива. Здесь нужно назначить 3 индекса X, Y и Z, для записи числа.
Примечание: эти три действия работают только для массива числового типа.
Например: нам нужно записать в массив несколько значений: 32, 48, 12, 33. Если мы используем только измерение X, то записать их мы можем под индексами: 1, 2, 3, 4. И если представить массив визуально, он будет выглядеть, примерно, так:
X | |||
1 | 2 | 3 | 4 |
32 | 48 | 12 | 33 |
Если мы используем измерение XY, то можем вписать числа под индексами 1:1, 1:2, 2:1, 2:2. И массив будет выглядеть так:
X | |||
Y | 1 | 2 | |
1 | 32 | 48 | |
2 | 12 | 33 |
Если использовать измерение XYZ, то индексы для значения могут быть, например, такие: 1:1:1; 1:1:2; 1:1:3; 1:1:4. А массив будет выглядеть как куб:
Для текста
Для записи в массив строковых переменных существуют точно такие же три действия как и для числовых.
- Write string to X
- Write string to XY
- Write string to XYZ
Думаю, не стоит их описывать. Главное помните, что эти три действия работают только для строкового массива.
Примечание
1) Количество элементов в каждом измерении не ограничено. Единственным ограничением является память компьютера либо мобильного устройства.
Трехмерный массив (XYZ) может быстро занять очень много места. Используйте его только если это действительно необходимо.
2) Вы можете указать любые индексы когда записываете что-либо в массив. Т.е. совсем необязательно задавать индексы по порядку как 1,2,3… можно и 5,10,15… НО
когда массив впервые записывает значение он создает ячейку под указанным индексом, и все ячейки по порядку до неё. Т.е. если вы записываете переменную в индекс 5, то массив создаст ячейки с индексами 1,2,3,4,5. При больших числах в индексе элемента это вызовет тормоза (особенно на мобильных устройствах). Что бы такого не происходило нужно заранее создавать массив в начале кадра — после создания ячеек массив работает с ними быстро и без тормозов. Ну, и старайтесь использовать ячейки по порядку.
3) Для индекса элемента нельзя использовать дробные и десятичные значения, а только целые числа, по этому
не используйте для определения индекса ячейки какие либо формулы, которые могут вернуть десятичное значение.
Получить значения из объекта Array
Что бы получить сохраненные в массив переменные используйте соответствующие выражения:
Для числового массива
- Read value from X position
- Read value from XY position
- Read value from XYZ position
Для строкового массива
- Read string from X position
- Read string from XY position
- Read string from XYZ position
Просто выберете выражение с количеством измерений, которые вы использовали для записи и укажите индексы.
Практическое применение объекта Array
Признаюсь, мне было сложно привести достойный пример, где массив был бы не заменим, но думаю, у меня получилось.
Задача
На сцене игры есть 5 островов. Если кликнуть ЛКМ по острову, над ним появляется снег.
Причем, можно создавать только один объект снега над одним островом. А если кликнуть ПКМ по острову, то снег над ним исчезает и потом снова можно создать снег.
При помощи Array эту задачу можно решить следующим образом:
- Сначала все острова нумеруются по порядку с помощью Spreed Value в переменной Номер
- Затем отслеживаем событие клика ЛКМ по острову и сравниваем Global String A с ячейкой массива под номером острова, таким образом мы определяем есть ли у острова снег. И если нет, то создаем снег в позиции острова и записываем в массив значение «снег».
Глобальная строковая переменная A (Global String A) содержит значение «снег»
- Что бы определить к какому острову относится снег передаем в переменную снега номер острова.
- Далее, когда происходит клик ПКМ по острову, то удаляется соответствующий объект снега, а ячейка массива отчищается для этого острова.
Вернее, в ячейку массива записывается нейтральное значение «нет», т.к. у объекта Array не существует такого действия как удалить значение из ячейки. Единственное, что можно сделать это выбрать действие Clear Array, но оно отчищает весь массив.
Пока ничего сложного. И для решения подобной задачи не обязательно использовать массив, можно сделать это, например, при помощи flag. Но давайте немного усложним задачу!
Пример посложнее
Теперь помимо снега на острове можно создать ещё облачко и звезду. И также каждый из них должен быть только один у одного острова. Это уже меняет задачу из отношения «один ко многим» к отношению «множество к множеству».
Здесь каждый остров в массиве должен иметь не только собственный номер, но ещё и номера для объектов, которые к нему принадлежат.
Я создал три кнопки для выбора того, что мы собираемся создать на острове.
Глобальное значение А (Global Value A) является номером того или иного объекта.
И теперь событие создания объектов меняется следующим образом:
Что бы сработало событие Create object by name нужно дать объектам названия, соответствующие переменной Global String A:
Далее, вторая часть задачи: как убрать со всех островов только выбранный объект? Здесь нужно применить вложенные циклы по объектам For Each loop.
По клику ПКМ запускается цикл по всем элементам (снег, облако, звезда). Они объединены в группу.
Далее, когда этот цикл выполняется в переменную Global Value B передается Номер текущего элемента
Номера элементов записаны в их переменную Номер и совпадают с номерами, которые устанавливаются в Global Value A при выборе элемента.
и запускается цикл по всем островам. Т.е. в одной петле группы элементов содержится перебор всех островов, и мы сравниваем каждый элемент со всеми островами. И таким образом определяем есть у какого-то острова данный элемент, и если он есть, то удаляем этот элемент и отчищаем ячейку массива для текущего острова.
Скачать исходный файл
Конечно, в принципе, и эту задачу можно решить используя обычные переменные вместо массива. Но, а если в игре не три элемента, а сто? Или процесс игры выстроен таким образом, что вы вообще не знаете сколько их будет? Тут никаких переменных не хватит. Активный объект ограничен 26-ю числовыми и 10-ю строковыми переменными. А что если вам надо больше? Тут Array object не заменим. Используйте его в своих играх и будет вам счастье)
Сохранение данных массива
Вы можете сделать сохранение массива для вашей игры с помощью действий:
- Load array from file. В этом действии вы должны указать имя файла для загрузки в формате .arr. Он загружает в массив ранее сохраненный файл. Каждое измерение изменяется в соответствии с размерами массива в файле, и все элементы заменяются новыми.
- Load an array from file via a file selector. Это действие откроет диалог выбора файла во время выполнения, спросив имя файла для загрузки. Как и в предыдущем действии, файл должен быть ранее сохранен объектом.
- Save array to file. В этом действии вы должны указать имя файла в формате .arr для сохранения. Оно сохраняет все содержимое массива, каждое значение и каждую строку. Используйте предыдущие действия, чтобы перезагрузить массив.
- Save array to file via a file selector. Это действие открывает диалог выбора файла во время выполнения, спросив имя файла, чтобы создать.
Вам совсем не обязательно самому создавать файл для сохранения массива. Просто выполните действие Save array to file и Clickeam Fusion сам создаст указанный файл.
На практике это выглядит следующим образом:
Для экспорта мобильных приложений нужно добавить файл .arr в Data Elemets
Но вернемся к нашему примеру
Ясно, что если загрузить сохраненный массив, то созданные ранее объекты (снег, облако и звезда) от этого не появятся. Их нужно вновь создать на основе данных из загруженного массива. В этом снова помогут петли FastLoop.
Запускаем цикл FastLoop под название «загрузить» столько раз, сколько у нас островов. Важно запускать петлю после загрузки массива.
Далее ничего сложного. Когда выполняется цикл мы сравниваем Номер острова с индексом текущей петли, что бы выбрать один из островов.
К индексу петли прибавляется единица, потому что нумерация петлей начинается с нуля, а номера островов с единицы.
И в этом событии создаем объект под именем, которое хранится в массиве под индексом петли (который совпадает с номером острова) и номером элемента. Т.к. у нас три элемента, то и событий выполнения петли тоже три. Меняется лишь индекс выборки массива по Y.
Теперь при загрузке массива будут так же загружаться объекты, которые были сохранены.
Скачать ArraySaveExample.mfa
На этом все. Надеюсь, Я не слишком вас утомил, и смог объяснить основную идею использования массива.
Если этот пост был полезным для тебя, будь другом, поставь лайк! А так же поставь звездный рейтинг и подписывайся на обновления, будет ещё много интересного.