Пятница, 29 Марта 2024, 13:36

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Ресурсы и Примеры игр » Исходники и примеры » Пример инвентаря (На Game Maker 8)
Пример инвентаря
DataTravel23Дата: Четверг, 28 Марта 2013, 14:39 | Сообщение # 1
частый гость
Сейчас нет на сайте
Вот нашла несколько интересных примеров инвентаря. Часть 1 Цитирую авторов:
___
Авторы: Dva_Kota, bodimir, Alexis

Небольшой пример инвентаря с подробными комментариями (на русском языке).
Этот пример был сделан для игры Wonderful World Armatrit. Теперь он модифицирован для игры The Heroes of Stream - Wolrand и к нему добавлен инвентарь экипировки – можно надевать различные вещи и предметы на игрока.
Всю графику для примера рисовал Alexis.

Я видел не так уж мало примеров инвентаря, но все они мне не очень нравились. Там было много кода (если в инвентаре достаточно функций) и чтобы его как-то изменить (изменить количество ячеек изменить их размер и т.д.) нужно было «бродить» по скриптам, добавлять кучу строк для каждой новой ячейки, причем добавлять строки нужно в разные скрипты и разные места кода. Может быть, есть более удобные в использовании инвентари, просто я их не видел. По этой причине пришлось создавать свой инвентарь, который можно легко добавлять в любые проекты, практически ничего не меняя…

Прошу обратить внимание на то, что предметы в инвентаре не являются объектами. При перемещении «предмета» в инвентарь происходит следующее: параметры объекта записываются в массивы, а сам объект удаляется из комнаты. В событии рисования объекта obj_inv происходит просто рисование спрайтов объектов, перемещенных в инвентарь, в соответствии с данными из массивов. Когда «выбрасываем» «предмет» из инвентаря – создается объект, данные которого записаны в ячейку массива, соответствующую ячейке инвентаря, в которой находился «предмет». Когда перетаскиваем «предмет» из одного инвентаря в другой – значения массива первого инвентаря переписываются в массив второго инвентаря. Это следует учитывать, например, если вам нужно подсчитать количество объектов в комнате – объекты в инвентаре не будут учитываться. Дальше под понятием «предмет» следует понимать несколько массивов, содержащих данные объекта, а под понятием «объект» сам объект ГМ.
[spoiler=Возможности/функции версии 1.0026 (старая версия,просто инвентарь)]
• Можно задавать количество ячеек по горизонтали и вертикали. Количество ячеек за-дается при создании инвентаря.

• Можно задавать любые размеры ячеек, любую ширину и высоту, ячейки не обязательно должны быть квадратными, можно делать прямоугольные ячейки, можно делать ячейки вообще любой формы, только не забудьте убрать точную проверку столкновений. За размер и форму ячеек отвечает спрайт spr_inv каким вы его сделаете, такими и будут ячейки инвентаря (не забудьте убрать точную проверку столкновений у этого спрайта!)

• Можно задавать фон для инвентаря. Будет отображаться как рамка вокруг всех ячеек (для разных размеров инвентаря нужно будет делать разные спрайты фона). Задается спрайтом spr_inv_back.

• Предметы можно складывать в ячейки по одному, по несколько или в любом количестве (можно настроить отдельно для каждого предмета). Существует объект obj_smil_base. Это родительский объект для всех предметов. В этом объекте прописан код перемещения предмета в инвентарь. Параметры предметов задаются в их событиях создания. Это две переменные: в первой записано название предмета (можно русскими буквами, но не забудьте добавить русский шрифт), это название будет выводиться при наведении курсора на объект в инвентаре; во вторую записывается лимит количества предметов в одном слоте (если не указывать эту переменную – можно складывать данный предмет в дин слот в не ограниченном количестве).

• Предметы можно перетаскивать из одной ячейки в другую.

• Если в нескольких ячейках одинаковые предметы их можно объединить в одну (если позволяет максимальное количество данных предметов в одной ячейке)

• Можно выбрасывать предметы из ячейки. Выбросить все предметы из ячейки перетащив их правой кнопкой мышки за пределы инвентаря, или выбрасывать предметы по одному удерживая клавишу Shift и кликая на предмет в инвентаре правой кнопкой мыши. В примере четыре предмета. Два из них, при выбрасывании, появляются чуть ниже игрока, остальные два появляются в случайной точке комнаты. Код «выбрасывания» на-писан в событии Glob Right Released

• Можно использовать предметы из инвентаря, кликая по ним левой кнопкой мыши. Код использования написан в событии Left Pressed (для каждого предмета нужно про-писать свой код, т.к для каждого предмета при использовании будут выполняться свои действия!).

• При наведении курсора на предмет в инвентаре показывается его название. Сюда, при желании можно добавить и другую информацию, например характеристики предмета. Можно изменить положение этой надписи (в этом примере название предмета появляется под ячейкой, в которой находится предмет)[/spoiler]

[spoiler=Возможности/фукнции версии 1.0064 (инвентарь+ инвентарь экипировки)]
• Можно задавать количество ячеек каждого инвентаря по горизонтали и вертикали. Количество ячеек задается при создании инвентаря (в каждом инвентаре отдельно).
• Можно задавать любые размеры ячеек, любую ширину и высоту, ячейки не обязательно должны быть квадратными, можно делать прямоугольные ячейки, можно делать ячейки вообще любой формы, только не забудьте убрать точную проверку столкновений. За размер и форму ячеек отвечает спрайт spr_inv, каким вы его сделаете, такими и будут ячейки инвентаря (не забудьте убрать точную проверку столкновений у этого спрайта). Для основного инвентаря и для инвентаря экипировки можно задавать разные ячейки (в примере используются одинаковые ячейки).
• Можно задавать фон для инвентаря. Будет отображаться как рамка вокруг всех ячеек (для разных размеров инвентаря нужно будет делать разные спрайты фона). Задается спрайтом spr_inv_back для основного инвентаря и спрайтом spr_inv_equip_back для инвентаря экипировки (обратите внимание, что спрайт spr_inv_equip_back нужен обязательно, иначе пустые ячейки инвентаря экипировки не будут отображаться).
• Предметы можно складывать в ячейки по одному, по несколько или в любом количестве (можно настроить отдельно для каждого предмета). Существует объект obj_item_base. Это родительский объект для всех предметов. В этом объекте прописан код перемещения предмета в инвентарь. Параметры предметов задаются в их событиях создания.
• Предметы можно перетаскивать из одной ячейки в другую.
• Если в нескольких ячейках одинаковые предметы их можно объединить в одну (если позволяет максимальное количество данных предметов в одной ячейке)
• Можно выбрасывать предметы из ячейки. Выбросить все предметы из ячейки, перетащив их правой кнопкой мышки за пределы инвентаря, или выбрасывать предметы по одному удерживая клавишу Shift и кликая на предмет в инвентаре правой кнопкой мыши. Код «выбрасывания» написан в событии Glob Right Released
• Можно использовать предметы из инвентаря, кликая по ним левой кнопкой мыши. Код использования написан в событии Create в переменной act_on (для каждого пред-мета нужно прописать свой код, т.к. для каждого предмета при использовании будут выполняться свои действия!).
• Если подобрать предмет, который можно надеть на игрока, и если для этого предмета есть соответствующий пустой слот – он переместится сразу в инвентарь экипировки. Эту функцию можно убрать, удалив часть кода в событии Create объекта obj_item_base (в коде есть комментарии и указания что именно нужно удалять).
• При наведении курсора на предмет в инвентаре показывается его название. Сюда, при желании можно добавить и другую информацию, например характеристики предмета. Можно изменить положение этой надписи в событии Draw у объектов obj_inv и obj_inv_weapon (там есть соответствующие комментарии и подсказки). В этом примере название предмета появляется под ячейкой, в которой находится предмет.
• Инвентарь экипировки состоит из 9-и слотов (его можно настроить как угодно и сде-лать любое количество слотов).
• Слоты инвентаря экипировки имеют разный тип, в зависимости от того какой пред-мет туда можно положить (например оружие или одежда)
• Некоторые слоты имеют одинаковый тип (в примере два слота для оружия) - предме-ты в таких слотах можно менять, местами перетаскивая правой кнопкой мыши
[/spoiler]
[spoiler=Как добавить в игру инвентарь версии 1.0064(инвентарь+инвентарь экипировки)]
1. Скопируйте объект obj_inv, obj_inv_weapon, obj_item_base в свой проект. obj_item_base можно назвать по-другому, как Вам больше нравится. Этот объект нужно сделать родительским для всех объектов, которые вы хотите помещать в инвентарь.

1.1. Если нужно чтобы инвентарь можно было закрывать/открывать – скопируйте объект obj_inv_open. Открытие и закрытие реализовано двумя способами: 1 – при на-жатии ЛКМ на этом объекте, 2 – при нажатии клавиши «I». Если хотите сделать только нажатие по клавише не клавиатуре – сделайте этот объект невидимым, уберите у него событие нажатия клавиши мыши и можете убрать у него спрайт.

2. Скопируйте спрайты spr_txt_back, spr_inv, spr_inv_back, spr_inv_equip_back в свой проект. Спрайты можно поставить свои, но имена должны быть именно такими. spr_inv_back – это фон инвентаря. Он не обязателен. Если не хотите его использовать, удалите строку draw_sprite(spr_inv_back,-1,x,y); в объекте obj_inv в событии Draw. Спрайт spr_inv_equip_back – это фон инвентаря экипировки, он нужен обязательно и в нем должны быть нарисованы пустые ячейки.

2.1. spr_inv – фон ячейки инвентаря, от нее зависят размеры (об этом было сказано выше). При желании для инвентаря экипировки можно использовать другие спрайты ячеек (даже другого размера) – не такие как для основного инвентаря. Для этого создайте спрайт ячейки для инвентаря экипировки и у объекта obj_inv_weapon в событии Draw замените везде spr_inv на имя спрайта ячейки инвентаря экипировки. Центр этого спрайта обязательно должен находиться в координатах (0,0)!

3. В событии Create объекта obj_inv, задайте размеры инвентаря, например так:
Код:
Код
inv_height_y=3; // Количество ячеек в высоту
inv_width_x=4; // Количество ячеек в ширину

В событии Create объекта obj_inv_weapon задайте размеры инвентаря экипировки, например так:
Код:
Код
inv_height_y=3;//Количество ячеек в высоту
inv_width_x=3;//Количество ячеек в ширину

Здесь можно задавать любые значения в зависимости от того какого размера вам ну-жен инвентарь.

4. Во всех объектах, которые нужно перемещать в инвентарь, в событии Create задайте переменные:
name – название предмета (можно русскими буквами, но не забудьте добавить русский шрифт), это название будет выводиться при наведении курсора на объект в инвентаре;
max_number – лимит количества предметов в одном слоте. (Если не указывать эту пе-ременную – можно складывать данный предмет в один слот в не ограниченном коли-честве). Для предметов, которые можно перемещать в инвентарь экипировки, эта переменная должна быть равна 1 (т.е. по одной вещи в одном слоте), но при желании можно перенастроить инвентарь, чтобы было по несколько вещей в одном слоте;
act_on – код, который должен быть выполнен при использовании предмета (например, пополнение здоровья при использовании зелья лечения) или код, который должен вы-полняться при надевании предмета (например, увеличение брони);
act_off – код, который должен выполняться при снятии предмета с игрока, обычно это код, противоположный коду из предыдущей переменной (если в act_on записано увеличение брони, то в act_off нужно записать уменьшение брони на ту же величину);
item_type – тип предмета. В примере существуют такие типы предметов (Вы можете задать любое количество типов предметов): 0 - обычный предмет, 1 – оружие, 2 – шлем, 3 – броня, 4 – обувь, 5 – перчатки, 6 – амулет, 7 – кольца. Тип 0 нельзя пере-мещать в инвентарь экипировки, все остальные – можно. От типа зависит то, в какие ячейки инвентаря экипировки можно будет перемещать предмет. Можно создать кон-станты с этими значениями, для боле удобной работы с инвентарем.

4.1. Оружие, в отличие от остальных предметов, создается в руках у игрока в виде объектов и следует за ним. Для того, чтобы оружие из слота правой руки было прикреплено именно к правой руке, а из левой – к левой, в коде есть переменная r_weap, которая вычисляется при перемещении оружия в оружейный слот и из него, и показывает к какой руке относится это оружие (r_weap = true – правая рука, r_weap = false – левая рука). В переменных act_on и act_off (где расположен код) проверяется эта переменная и в зависимости от того в какой руке то оружие, с которым происходит действие перемещения из слота или в слот, выполняются соответствующие действия. Когда берем оружие (act_on) – создается предмет «оружие, которое будет в руках у игрока и будет перемещаться за ним» а – это отдельный объект. Для него, в зависимости от того в какой руке это оружие, задаются разные координаты привязки, которые потом используются в Step оружия, привязанного к игроку (обратите внимание на то, что предмет «меч, который можно подобрать» «меч, который находится в руках у игрока» - разные объекты, хотя имеют одинаковый спрайт!), потом id созданного экземпляра объекта оружия записывается в переменную obj_hero.weap_r (если оружие в правой руке) или в переменную obj_hero.weap_l (если оружие в левой руке) – для того чтобы можно было удалить оружие из этой руки. Когда выбрасываем оружие или меняем его на другое (act_off) – удаляем экземпляр объекта, записанный в переменную obj_hero.weap_r (если оружие было в правой руке) или в переменную obj_hero.weap_l (если оружие было в левой руке).

5. Типы ячеек для инвентаря экипировки задаются в событии Create объекта obj_inv_weapon массивом item_type[]. Здесь для каждой конкретной ячейки определяется тип. Если Вы хотите чтобы предметы в инвентаре экипировки располагались как-то по-другому или чтобы было другое количество ячеек – можете настроить это так, как вам нравится.

6. добавить шрифт font0, которым будут отображаться надписи при наведении курсора на предмет в инвентаре. Название шрифта можно изменить. Тогда в событии Create объекта obj_inv нужно будет прописать другой шрифт в первой строке
draw_set_font(font0);

7. Вернемся к объекту obj_item_base. Там всего лишь одно событие – столкновение с игроком. Вы можете заменить это событие на другое, при котором должно происходить перемещение предмета в инвентарь (например, нажатие левой кнопки мыши) или добавить дополнительную проверку на нажатие клавиши, чтобы предметы подбирались только тогда, когда игрок столкнулся с ними и нажал, например, клавишу «Е».

8. Можно настроить положение инвентарей относительно вида в событии Draw у объектов obj_inv, obj_inv_weapon.[/spoiler]
[spoiler=Немного про код в примере( что бы не было лишних вопросов)]
В событии создания инвентаря задаются несколько массивов и переменные. Некоторые из них можно не задавать в событии создания. Я это сделал для того чтобы Вам легче было разобраться какой массив и какая переменная для чего нужны.

Код
Код:
Код
/*вычисляем на какой ячейке находится курсор (тут вычисляются не координаты, а как бы элемент массива которому принадлежит
ячейка над которой курсор*/
klick_x=floor((mouse_x-x)/slot_width_x);
klick_y=floor((mouse_y-y)/slot_height_y);

во всех событиях инвентаря я добавил из-за того что события нажатия клавиш мышки и события рисования происходят не одновременно. Если поставить код только в событии рисования, то при быстром перемещении мышки может оказаться что во время вычислений мышка была в одном месте, а при клике она уже будет в другом месте. Из за этого появляются ошибки.[/spoiler]
Еще несколько способов модифицировать инвентарь:
[spoiler=Код проверки наличия предмета в инвентаре(любая версия)]
Код
//Это код проверки наличия предмета в инвентаре

with (obj_inv)//выполняем код для объекта obj_inv
     {
     for (slot_y=0; slot_y<inv_height_y; slot_y+=1)//выбираем строку инвентаря для проверки
         {
         for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//проверяем все ячейки в этой строке, а потом опять выполнится сторка выше и мы перейдем к следующепй строке инвентаря  
             {
             if (txt[slot_x,slot_y]='Grin')//когда находим ячейку с таким же предметом
                 {
                       //здесь код, который должен выполниться если предмет есть в инвентаре
                 }
             }
         }
     }
[/spoiler]

Скачать:
primer_inventarja_dva_kota_bodimir_1.0028_rpg_mod_.gmk
primer_inventarja_dva_kota_bodimir_alexis_1.0064_r.gb1
primer_inventarja_dva_kota_bodimir_1.0026.rar
primer_inventarja_dva_kota_bodimir_alexis_1.0078_m.gmk
primer_inventarja_dva_kota_bodimir_alexis_1.0064_r.gmk
MasterSamboДата: Суббота, 20 Июля 2013, 15:49 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Спасибо! Давно мечтал добавить в игру инвентарь!
AlastarДата: Суббота, 20 Июля 2013, 15:57 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
Многатекста wacko
PS Разве так трудно сделать инвентарь? Этож элементарно.


Big Boobs (+18 only!)
berilДата: Воскресенье, 21 Июля 2013, 20:40 | Сообщение # 4
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Цитата (Alastar)
Многатекста wacko
PS Разве так трудно сделать инвентарь? Этож элементарно.

Ну если много текста это уже не элементарно




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
Shevron_7Дата: Воскресенье, 21 Июля 2013, 21:32 | Сообщение # 5
маньяк-бомбист
Сейчас нет на сайте
Цитата
The page does not seem
to exist!


TEST =>
Мои игры:
Kill your brain
Space Conflict
Zombie Day
Bounce PC
Extra ball 2012

Это спасибо в карман не положишь, а в репутацию можно. +1
MasterSamboДата: Понедельник, 22 Июля 2013, 16:53 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Цитата (Alastar)
Многатекста
PS Разве так трудно сделать инвентарь? Этож элементарно.

Лично я, не умел делать его!
CreatingOverДата: Вторник, 23 Июля 2013, 17:05 | Сообщение # 7
ColdGamedev
Сейчас нет на сайте
Цитата (arkady)
Лично я, не умел делать его!

Не знаю. Я хоть и другим способом, но делаю легко.


Я снова с вами:з
Возвращение легенды. (нет)
EshfordДата: Вторник, 23 Июля 2013, 17:17 | Сообщение # 8
Богиня Гамака ♥
Сейчас нет на сайте
Ого, что всплыло, жаль у автора нет времени его дальше развивать.
Цитата (DataTravel23)
Теперь он модифицирован для игры The Heroes of Stream - Wolrand

Дааааа~
Агаааааа~
А как жеее~


Сообщение отредактировал Alexis-63 - Вторник, 23 Июля 2013, 17:18
berilДата: Вторник, 23 Июля 2013, 23:40 | Сообщение # 9
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
все ссылки битые



Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
Shevron_7Дата: Среда, 24 Июля 2013, 02:19 | Сообщение # 10
маньяк-бомбист
Сейчас нет на сайте
beril, 5 комент.

TEST =>
Мои игры:
Kill your brain
Space Conflict
Zombie Day
Bounce PC
Extra ball 2012

Это спасибо в карман не положишь, а в репутацию можно. +1
Форум игроделов » Ресурсы и Примеры игр » Исходники и примеры » Пример инвентаря (На Game Maker 8)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг