Продвинутый инвентарь

другие уроки, мануалы, советы по Construct 2

Полезный урок?

Да
64
96%
Нет
3
4%
Всего голосов : 67

Сообщение Продвинутый инвентарь
» 07 апр 2015, 22:54

Вы наверное многие знаете про статью инвентарь на основе массива.
Когда я только начинал работу в констракте, я не мог понять даже эту статью с массивом, для меня массив был чем-то неопознанным, но теперь я разобрался с ним и готов с вами поделиться продвинутым инвентарем на основе того движка с изменениями и особенностями:

- Можно перетаскивать предметы посредством Drag and Drop,
- С помощью зажатия Ctrl на клавиатуре можно делить предметы.
- При добавлении предмета в инвентарь (например герой подобрал предмет) он создается в первой незанятой ячейке или добавляется к предмету с таким же ID.

Изображение

Скоро запишу видео по этому уроку

Начнем по-порядку :smile:

Буду использовать тот же самый принцип построения инвентаря, что и в том уроке.
Нам понадобятся:
1) Спрайт слота - Slot - я делал его без анимации, простой кадр.
Изображение
Для Slot нужна переменная Id, которая показывает уникальный номер по порядку из всех созданных ячеек, следующая переменная - item, в которой будет храниться айди предмета, последняя переменнная - number, где будет записано количество этого предмета.

2) Спрайт предметов - Item - скорость анимации - 0, здесь будем в каждом кадре ставить свой предмет, например для кадра 1 - меч, для кадра 2 - сабля, но первый кадр будет пустой.
Изображение
Для item нужна переменная number, где будет записано количество этого предмета.

3) Текст Text_number, отображающий количество объектов. Простой текст, только белого цвета.
4) Массив - Inventory - размерность - высота 2 - глубина 1 - ширина как хотим - это будет количество ячеек инвентаря, я взял 20.
5) Объект мыши. (Для перетаскиваний)
6) Объект клавиатуры. (Для разделения предметов)
7) Объект Function - для создания удобных для нас функций:)

Массив используется двумерный, то есть как таблица, в первой строке имя предмета, во второй количество предмета и так для всех столбцов.
Изображение
23 - это будет 22 кадр анимации предмета item, 11 - его количество.
0-пустой предмет, значит и пустая ячейка.

Перейдем к переменным. У меня их всего три глобальных.
Изображение
stX отвечает за номер ячейки массива.
itemid отвечает за временное хранение айди предмета.
itemnumber отвечает за временное хранение колличества этого предмета.

Теперь начинаем разбираться с событиями

Изображение

Первая фунция - open_inv. Она будет включаться тогда, когда мы будем открывать инвентарь. Она будет перерисовывать наш инвентарь. Удалять старый и создавать на его месте новый.
Чтобы удалить старый мы просто в начале функции разрушаем объекты slot, item и text_number.

Также в этой функции есть локальные переменные a, b и с
a и c - их не трогаем, они используются для временного хранения. a - для следующего значения X для слота, c - для значения Y для слота.
b - отступ от ячейки по ширине, например ячейка размером 64х64, чтобы сделать отступ в 16 пикселей, значение должно быть 80, ну надеюсь вы поняли меня.

Дальше мы создаем подсобытие для каждого элемента X в массиве инвентаря мы делаем следующее:

1) сравниваем переменную А - если она равна b*5 (пять - это количество ячеек в строке), то мы добавляем к С - 80(чтобы следующие слоты создавались на 80 пикселей ниже) и переменную А приравниваем к 0, чтобы следующая ячейка создалась под столбцом самой первой ячейки.
2) Если переменная не равна, то:

а) мы делаем одно действие, где добавляем b в нашу переменную А, чтобы следующая ячейка была правее. И создаем объект слот в: по X - будет любое число + a, для Y будет любое число + c. Помню не мог вычислить по тому уроку точное положение инвентаря. Здесь же всё видно. И устанавливаем ему переменные. CurX - это текущий номер столбца массива. Где просто стоит Curx - это обозначает первую строчку столбца, т.е. (CurX,0) (айди предмета), а где стоит (CurX,1) -это обозначает вторую строчку столбца, то есть количество предмета. Для переменной Id у слота используется CurX+1, чтобы наш слот не начинался с айди 0, тогда бы он просто не существовал.

б) Мы сравниваем значение айди предмета в массиве, если оно больше 0, тоесть не пустое, то тогда мы создаем объект item на слое лежащем выше, чем слой со слотами(потому что объект item при перетаскивании будет под спрайтами слотов) и устанавливаем ему переменную и кадр.

в)Подсобытие для б. Мы сравниваем значение количества предмета в массиве, если оно больше 0, то тогда мы создаем текст и ставим ему текст с числом.

Функция готова, теперь ее можно применять когда угодно и где угодно!)

Следующая функция - Get_item
Она Создает предмет в инвентаре.
Изображение
Переменная additem - будет служить остановкой цикла. Когда она будет равна 1, то цикл перестает проверяться. Переменная Checkitem - будет служить стартом для нового цикла. Принцип такой: сначала проверяется есть ли похожий предмет в инвентаре, если есть то мы к нему складываем количество, если нет такого, то мы запускаем новый цикл где перебираются все ячейки в поисках первой пустой.

Когда Sprite2(наш герой) соприкасается с item2(просто предмет) то мы первой переменной ставим айди предмета, а второй - количество и запускаем функцию.

:Для каждого элемента массива мы делаем проверку:
1) Если в инвентаре есть такой же объект, то мы его складываем.
2) Если такого объекта нет
А) Мы ищем пустую первую ячейку и вставляем в нее предмет.

Функция номер два готова!)

Далее следует самая беда с переносом объекта посредством drag and drop, для начала добавьте это поведение предмету item.
Изображение
Изображение

Соберемся и читаем:
Во главе идет проверка, пересекается ли мышь с объектом слота. Это сделано за тем, чтобы предмет точно находил свое место.
Дальше мы при "захвате" нашего предмета: делаем ему масштаб по-больше для красоты :smile: и устанавливаем переменные id - как кадр анимации предмета, number как количество предмета. А если предмет наложен был на текст, то текст скрывается, чтоб не раздражало тоже :smile:
А дальше при "бросании" предмета: мы проверяем нажата ли клавиша ctrl на клавиатуре(и количество предмета больше единицы),

1) если да, то: идет проверка, если предметы одинаковые, то последнему предмету добавляется округленная вверх половина количества перетаскиваемого предмета, а у перетаскиваемого объекта остается округленная вниз половина количества предмета. А если предмета в последней ячейке вообще нет, то мы проделываем штуку с разделением, только мы в последней ячейке добавляем массиву еще и айди, чтобы предмет был виден.(создается копия).

2) если ctrl не зажата, то мы просто меняем предметы местами, если они разные, а если они одинаковые, то тогда мы их складываем. Автор здесь использовал 6 переменных, но мне хватило трех, я вспомнил про паскаль и как там можно с помощью одной переменной поменять значения.

//////Важно! Утром заметил, что при разделении одного объекта и накладывании на другой, инвентарь не воспринимает эту команду и ничего не происходит, дело было вот в чем:
Изображение
Там просто было два сравнения: когда предметы одинаковые и когда предмета нет, но я забыл добавить сравнение "Если объект не равен предмету и он больше нуля" тогда просто открываем инвентарь, потому что ничего с этим делать не нужно:) Перезалил файл)

Slot.ID = stX+1 это значит что мы как взяли предмет, так никуда не перетаскивая его отпустили, в одну и ту же ячейку, без этого события количество предметов убавляется, а так мы просто оставляем предметы теми же и обновляем инвентарь:)

И если мы не попадаем предметом по ячейке или мы его выкидываем из инвентаря, то он просто обновляет инвентарь и все остается на местах :)

А вот простой пример при старте слоя мы прописываем предметы (в 1, 0 - айди, в 1, 1 - количество)
Изображение
И простая кнопка для показа или обновления инвентаря.

Всем удачных экспериментов и проб!)
интерфейс.rar
(200.15 КБ) Скачиваний: 714
Аватара пользователя

Участник
Сообщений: 60
Я тут с 04 сен 2014
Репутация 15 [ ? ]

Сообщение Продвинутый инвентарь
» 12 май 2015, 08:54

Надо попробовать, в закладки.
Изображение
Аватара пользователя

Участник + TDS
Сообщений: 114
Я тут с 14 фев 2013
Лицензия: Personal
Репутация 6 [ ? ]

Сообщение Продвинутый инвентарь
» 15 июн 2015, 01:36

Весьма толковый инвентарь, спасибо.
Изрядно повозился с уроком, всё тщательно изучил, до некоторых вещей пришлось догадаться. Коменты объясняют общий алгоритм работы, но не раскрывают особенностей общения с массивом типа inventory.At, я не уверен до конца что эта команда делает, вероятно запрашивает значение массива... Ну да, походу.
28 ивент в скриншоте ничего не делает, удалил.
В функции get_item в 13 и 16 ивентах прописал call function "open_inv", так как не обновлялся инвентарь сам.
Отполировал мальца, буду теперь пользоваться=) Ещё раз спасибо=)
Аватара пользователя

Участник
Сообщений: 328
Я тут с 02 авг 2014
Откуда: Москва
Лицензия: Peronal
Репутация 131 [ ? ]

Сообщение Продвинутый инвентарь
» 17 июн 2015, 22:41

Решил поморочиться с вместимостью инвентаря, то есть "что если он полон, а мне блин надо поднять лишний итем?".
И вот мой вариант решения:
Изображение
Переменная checkitem как бы зависит от количества циклов. И соответственно если количество циклов превышает ширину массива, то итем в массив не попадает.
У меня ширина массива 10(инвентарь на 10 слотов), и при заполненном инвентаре переменная checkitem вырастала до 19, куда ушли 9 циклов мне не ведомо....
Так вот... Лишний цикл происходит и итем пересоздаётся, благо есть откуда взять itemid и itemnumber=) Вы конечно пишите как вам больше нравится, но вот в моём случае итем с пола поднимается клавишей Е, и если я зажму её то получается как буд-то мой перс его тащит=) Типа чо не влезло в руках донесу=)
Аватара пользователя

Участник
Сообщений: 328
Я тут с 02 авг 2014
Откуда: Москва
Лицензия: Peronal
Репутация 131 [ ? ]

Сообщение Продвинутый инвентарь
» 12 авг 2015, 15:35

Всем привет, делаю для игры инвентарь по этому уроку, но есть проблема, не могу понять как сделать вычитание, допустим использовал аптечку или обезболивающие, и на один меньше стало, а если была 1шт. то вообще удалилась с инвентаря, не могу понять с чем едят эти массивы :sad:
Аватара пользователя

Участник
Сообщений: 1
Я тут с 05 июл 2015
Репутация 0 [ ? ]

Сообщение Продвинутый инвентарь
» 26 авг 2015, 18:25

Все отлично, но возможно ли переделать его под тач-устройства, особенно интересует как заменить часть "Cursor is over ..." :sad: :scratch_one-s_head:
фывфывфыв.PNG
Аватара пользователя

Участник
Сообщений: 7
Я тут с 26 авг 2015
Репутация 0 [ ? ]

Сообщение Продвинутый инвентарь
» 17 сен 2015, 08:14

Liebenswert писал(а):Все отлично, но возможно ли переделать его под тач-устройства, особенно интересует как заменить часть "Cursor is over ..." :sad: :scratch_one-s_head:

выставить мышку аналогом тача
Аватара пользователя

Участник
Сообщений: 79
Я тут с 26 июн 2015
Лицензия: Bussines
Skype: DeathMorose
Репутация 0 [ ? ]

Сообщение Продвинутый инвентарь
» 18 май 2017, 22:44

Vorser-Games писал(а):Всем привет, делаю для игры инвентарь по этому уроку, но есть проблема, не могу понять как сделать вычитание, допустим использовал аптечку или обезболивающие, и на один меньше стало, а если была 1шт. то вообще удалилась с инвентаря, не могу понять с чем едят эти массивы :sad:

Мне тоже интересно! Не могу въехать как отнимать количество из инвентаря. :help: :help: :help:
Помогите народ!!!
ИзображениеИзображение
Аватара пользователя

Участник
Сообщений: 34
Я тут с 08 апр 2016
Двиг: С2
Репутация 3 [ ? ]



Вернуться в Другие уроки по Construct 2

Сейчас эту тему просматривают

Зарегистрированные пользователи: нет зарегистрированных пользователей

Наверх