Inventory

Материал из wiki.appsalutecreator.com
Версия от 08:50, 17 апреля 2013; Nbeznosov (обсуждение | вклад) (Инвентарь на нескольких игровых экранах)

Перейти к: навигация, поиск

Инвентарь необходим для «собирания» игровых объектов с последующим их использованием. Инвентарь незаменим, если объекты находящиеся в одном экране должны быть использованы в другом экране.

Параметры

Картинка - ресурс для отображения инвентаря (тогда таблица помещается сверху инвентаря), может отсутствовать, если таблица имеет свой ресурс. Удобнее делать инвентарь безресурсным.

Сцена извлечения - можно указать конкретную сцену, на которую будет извлекаться инвентарь, не обязательно.

Объект — если для инвентаря один объект, то его можно указать в этом поле, но чаще всего объектов несколько (в этом случае оставляем поле пустым).

Сохранять извлеченный - принимает два значения: 0 - после извлечения из таблицы, при смене экрана или сворачивании, объект теряется; 1 - после извлечения из таблицы, при смене экрана или сворачивании, объект возвращается в таблицу.

Скорость

  • полёта — скорость полёта объекта перемещаемого в инвентарь к таблице инвентаря.
  • вращения — скорость вращения объекта во время полёта в инвентарь.

Таблица — таблица, в которой будут находиться объекты перемещенные в инвентарь. Если количество ячеек в таблице будет меньше,чем количество добавляемых объектов, то добавляемый объект при смене сцены потеряется.

Таблица для инвентаря

Может быть вертикальной, горизонтальной, или иметь несколько ячеек в ширину и несколько в высоту. Если у таблицы несколько строк и столбцов, то объекты заполняют столбцы, то есть объекты сначала заполнят первый столбец, потом начнут заполнять второй столбец, потом третий и т. д.. Объект при переводе инвентаря в состояние add или return летят к правому нижнему углу таблицы. Если в таблице не хватает места, то объекты в таблицу не попадают, а остаются возле правого нижнего её угла.

Состояния

add – добавить объект в инвентарь.

extract — достать объект из инвентаря.

return — вернуть объект в инвентарь.

remove - удалить объект из инвентаря.

Один объект не может быть добавлен (add) дважды. А извлекать (extract) и возвращать (return) объект в инвентарь можно n-раз. После того как объект "отработал", его необходимо удалить из инвентаря (remove), при удалении освобождается занимаемая им ячейка таблицы.

Добавлять в инвентарь можно различные типы объектов, например, рисунок, машина, текст, а так же объекты, содержащие свои подобъекты.

Инвентарь с таблицей располагаются на одной расшариной сцене, чтобы быть доступными на любом экране.

Инвентарь и таблица должны иметь параметр Память = 1, чтобы при смене экрана запоминались объекты, содержащиеся в таблице.

Объект, который добавляется в инвентарь, например, машина Obj1, должен находиться на отдельной сцене, у которой Пямять = 1 (чтобы сцена, которая изначально содержит Obj1, не инитилась больше, и объект не скакал от таблицы к сцене и обратно, т.к. это скакание заметно визуально при смене экранов). Лучше всего, если эта "родная" сцена с памятью содержала только объекты, которые будут добавляться в инвентарь.

Пример использования

Рассмотрим для примера проект в котором можно применить объект инвентарь.

Есть поросёнок, который ходит из одного края экрана в другой, и 3 объекта: молоток, шапка, ведро, которые разбросаны по экрану. По первому клику по каждому объекту они должны попасть в инвентарь -> по второму — достаться из инвентаря и начать тягаться. -> Когда объект попадает на поросёнка надо чтобы он появился у поросёнка -> клик на объект у поросёнка — объект снова попадает в инвентарь.

Пример использования состояний инвентаря

Invent example.jpg

Состояние to:

set

obj — указан инвентарь в который добавляем объект.
par — параметр в который будем записывать id добавляемого объекта. Для инвентаря этот параметр называется obj.
val_obj – указан объект, id которого будет записано в параметр obj инвентаря.

set

obj — объект который переводим в новое состояние, в данном случае будем добавлять объект указанный выше в инвентарь.
st — состояние в которое переводим инвентарь, в нашем случае добавляем объект в инвентарь, поэтому состояние add.


Состояние out - всё аналогично состоянию to, кроме второго set-а, которым достаём объект из инвентаря, с помощью перевода инвентаря в состояние extract. Аналогично прописываются перевод в состояния return, remove.

Обзор проекта

Инвентарь вынесен в отдельный глобальный экран для того чтобы в дальнейшем была возможность использовать один и тот же инвентарь на разных экранах. Экран инвентаря расшарен(сделана ссылка) на основной экран, для того чтобы инвентарь отображался на экране основной сцены, но мог быть отредактирован из других сцен в будущем. Также организована маска для поросёнка, на которую будут "падать" ведро, молоток, шапка. Маска вынесена отдельно для избежания проблем с падением объекта на группу объектов. Маска двигается с такой же скоростью, как и поросёнок.

Invent dcr pr.jpg


Настройки инвентаря и таблиц

Настройки инвентаря

Invent options.jpg

В качестве таблицы для инвентаря используем выбранную таблицу. Объекты в таблицу летят со скоростью 500 и вращаются со скоростью 360.


Настройки таблицы инвентаря

У таблицы всего 2 колонки и 2 строчки(определены в группе параметров "таблица"), видимых 2 колонки и 2 строчки(определены в группе параметров "размеры ячеек"), при этом объекты, которые попадают в таблицу инвентаря не будут сжиматься(сжимать = 0).

Invent table.jpg


Основные машины

Основное ведро: Invent bucket.jpg

По клику Передаём id ведра инвентарю и добавляем его в инвентарь, ждём второго клика. По второму клику достаём объект из инвентаря и разрешаем его таскать по экрану, при этом ожидаем что он "упадёт" на маску поросёнка. При падении на маску поросёнка ведро исчезает и включает до того скрытое ведро у поросёнка. Состояние with необходимо для того чтобы по клику можно было снова вытянуть объект из инвентаря, если его туда положила другая машина или кнопка.

Ведро у поросёнка: Invent p bucket.jpg

Изначально машина прозрачна и не видна на экране. Основное ведро переводит в определённый момент ведро у поросёнка в состояние on в котором ведро у поросёнка становится видимым и ожидает клика. При помощи изменения состояния у объекта инвентарь на состояние return основное ведро помещается в инвентарь, и делается видимым(alpha=1), а ведро у поросёнка становится прозрачным.

Основной молоток: Invent hammer.jpg

По клику Передаём id молотка инвентарю и добавляем его в инвентарь, ждём второго клика. По второму клику достаём объект из инвентаря и разрешаем его таскать по экрану, при этом ожидаем что он "упадёт" на маску поросёнка. При падении на маску поросёнка молоток исчезает и включает до того скрытый молоток у поросёнка.

Молоток у поросёнка: Invent p hammer.jpg

Изначально машина прозрачна и не видна на экране. Основной молоток переводит в определённый момент молоток у поросёнка в состояние on в котором молоток у поросёнка становится видимым и ожидает клика. При клике переводим основной молоток в состояние, в котором с помощью состояния инвентаря add молоток добавляется в инвентарь, и делаем основной молоток видимым, а молоток у поросёнка становится прозрачным.

Основная шапка: Invent hat.jpg

По клику Передаём id шапки инвентарю и добавляем её в инвентарь, ждём второго клика. По второму клику достаём объект из инвентаря и разрешаем его таскать по экрану, при этом ожидаем что он "упадёт" на маску поросёнка. При падении на маску поросёнка шапка исчезает и включает до того скрытую шапку у поросёнка.

Шапка у поросёнка: Invent p hat.jpg

Изначально машина прозрачна и не видна на экране. Основная шапка переводит в определённый момент шапку у поросёнка в состояние on в котором шапка у поросёнка становится видимым и ожидает клика. При клике переводим основную шапку в состояние, в котором с помощью состояния инвентаря add шапка добавляется в инвентарь, и делаем основную шапку видимой, а шапка у поросёнка становится прозрачной.

Инвентарь на нескольких игровых экранах

Также инвентарь можно использовать на нескольких игровых экранах, для этого надо расположить на глобальном экране сам объект инвентарь, его таблицу и все объекты которые будут класться в инвентарь. Для того чтобы при переходе с экрана на экран объекты, которые будут в инвентаре не приводили к ошибкам необходимо, как минимум, им в параметре "память" поставить "1". Тогда при переходе с экрана на экран объект не будет уходить в начальное состояние.

Рассмотрим на базе текущего проекта использование общего инвентаря для нескольких экранов. Для этого добавим ещё один экран. На него скопируем графику из игрового, кроме поросёнка, и расшарим туда инвентарь Обязательно поставим параметр "память" для ведра, молотка, шапки, которые на сцене с инвентарём, равным "1". Также укажем "память"="1" для шапки, молотка и ведра, которые у поросёнка.

В итоге у нас получится 3 экрана:

  • 1-й без поросёнка
  • 2-й с поросёнком на которого можно применять объекты из инвентаря
  • 3-й - глобальный - на нём инвентарь, таблица и объекты инвентаря.

Invent sh global.jpg

Изменения в настройках машин, которые помещаются в инвентарь, для корректного его использования: Inventory example save.jpg Аналогично необходимо сделать в машинах "ведро", "шапка", "молоток" у поросёнка

Теперь на первом экране можно собрать объекты в инвентарь и на втором их применить на поросёнке. Не использованные объекты будут оставаться в инвентаре. Если заберём все объекты с первого экрана в инвентарь, перейдём во второй экран, и применим, на пример, молоток, потом снова перейдём на 1-й экран, то в инвентаре останутся только 2 оставшихся объекта, а если снова вернёмся на 2-й экран, то поросёнок будет бегать уже с применённым на него объектом, если его вернём в инвентарь, кликнув на него, то он вернётся и будет перемещаться с инвентарём по экранам.

В качестве дальнейшего улучшения можно дописать условия которые будут скрывать и показывать определённые объекты на определённых экранах в зависимости от их местонахождения(в инвентаре или нет). С текущими настройками, не собирая объекты на первом экране, и переместившись на второй, они там будут т.к. сцена на которой они находятся расшарена и они в составе сцены будут отображаться на всех экранах.

Дополнительные возможности

Параметр ret - используется при изменении параметров объектов, помещенных в инвентарь. "Перечитывает" параметры объектов инвентаря и "возвращает" объекты с новыми параметрами сцене. Например, если в инвентарь был помещен объект, у которого альфа = 0, а затем в определенный момент мы меняем этому объекту параметр альфа на 1, то, чтобы эти изменения выполнились, необходимо через set объекту Inventory установить параметр ret в значение val_obj = сцена, на которой находится таблица и инвентарь.

На рисунке ниже done6 - подобъект объекта task_6, помещенного в инвентарь, у которого альфа меняется с 0 на 1. Объект типа инвентарь Task_Inv находится на сцене game. m_text - обычная машина, которая меняет параметр.

Ret.jpg

Состояние pos - Инвентарь в этом состоянии возвращает два параметра, строку и столбец ячейки, в которой находится объект (только перед тем, как перевести инвентарь в это состояние, нужно ему указать объект):

  • posRow - номер строки, начиная с 0;
  • posCol - номер столбца, начиная с 0.

Пример

Таблица инвентаря состоит из нескольких столбцов по три строки в каждом, нумерация сверху-вниз, справа-налево. Нам нужно вычислить номер, под которым объект task_6 добавлен в инвентарь. Переменной r присваивается строка, переменной c присваивается столбец, переменная taskk - номер в списке.

Pos.jpg