|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
реализация инвентаря и экипировки персонажа
Други! Я наконец добрался до практической реализации инвентаря для своей игрухи. Даже скорее не просто инвентаря, а инвентаря экипируемого. Просьба посмотреть и покритиковать то, что по итогу придумалось. Опирался я на вот эту схему от caseyryan и вообще последние 3 страницы обсуждения в той ветке. Говорю я сейчас исключительно о Модели.
1. Точно выбрал подход с отдельным деревом классов для предметов, где на вершине будет Item, а все остальные - расширяют его. Таким образом, для экипируемых предметов будет подкласс типа Equipment. 2. От исходной идеи сделать разметку точек экипировки персонажа с жёсткой привязкой типа помещаемых туда наследников Item: // В классе персонажа private var _pants: Pants; // слот для штанов private var _coat: Coat; // слот для курток 3. Вместо этого предусмотреть в каждом предмете класса Equipment вектор идентификаторов мест, куда надевать. Тут будут мои любимые строковые ID. Например: ["head"] для шапок или ["torso", "legs"] для комбинезона. 4. В классе персонажа завести массив или вектор, принимающий наследников Equipment, куда будет помещаться всё "надетое". Метод equip(equipItem: Equipment) будет проверять, нет ли в массиве экземпляров с совпадающими ID и при необходимости удалять имеющиеся. Вроде всё красиво. Смущает пока только тот факт, что самого перечня доступных точек экипировки (руки/ноги/голова/торс) в таком подходе вообще нигде не зафиксировано. Он по факту будет складываться из суммарного перечня ID "надетых" (т.е. добавленных в массив) шмоток. Нормально ли это? И где мне такой подход может аукнуться? Буду признателен за комментарии, особенно со стороны игроделов.
__________________
Не сломано - не чини! |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Мне всё же кажется, что иметь массив "точек" со ссылками на экипированые вещи было бы оптимальней, чем перебирать каждый раз ВСЕ вещи, сравнивая строковые идентификаторы (которые ты конечно забъешь в константы). В таком подходе изначально заложены ненужные действия, типа проверки шапки, уживается ли она с сапогами. Если же будет реестр по "точкам", для экипировки сапог ты будешь проверять только обувь, не дергая 10 раз статические константы в цикле по массиву.
(в TES кстати есть такой класс как мантия с капюшоном, забирающая сразу 3 слота — шапку, куртку и штаны. Кроме того, экипировка делится на Одежду и Броню, что дает более сложные условия, типа если герой наденет хотя бы один предмет из класса Броня — имеющий резист к физическому урону — его способность использовать магию сильно падает, ну и торговцы могут покупать одежду но не броню, или наоборот, или и то и другое).
__________________
Reality.getBounds(this); |
|
|||||
Я же говорил, начинать нужно со структуры данных, в которой будут выражены все связи. Ну не получится с таким подходом сделать что-то сложнее простого платформера.
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Wolsh, мне тоже интуитивно так больше нравится. Но только в голове пока на принципиальном уровне не укладывается. От слова совсем
Цитата:
Цитата:
Цитата:
Добавлено через 2 минуты Tails, я это не про диздок, а про код говорил.
__________________
Не сломано - не чини! |
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Appleman покажешь, что там у тебя за игра такая? Пару скринов хотя бы) Интересно. Можешь в лс даже)
|
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Godwarlock, интерес бывалых льстит, но показывать пока решительно нечего. Из визуализации только главный экран боя, всякие портреты-шкалы персов, да пара статус-иконок. Я всё пока над игровой логикой карпею.
Wolsh, мне кажется, я начинаю соображать, что ты хочешь мне посоветовать. Смотри, я правильно понимаю, что у персонажа мы делаем вот такие "полиморфные" слоты: Теперь если мы хотим надеть шляпу, то отбираем все экземпляры наследников Items -> Equipment -> Hat, проверяем, что записано в слоте _slotHat и впихиваем туда ссылку на наш экземпляр шляпы. При этом, если у нас, к примеру, куртка с капюшоном, то она хоть и экземпляр Coat, без проблем "пропишется" сразу в 2 слота, т.к. все они их общего супертипа. Это ты имел в виду? Верно я понял твою идею? И ещё... Если один и тот же экземпляр может "прописаться" в нескольких слотах, то придется ещё решать проблему расчёта эффектов, получаемых от предметов. Чтобы дважды не посчитать.
__________________
Не сломано - не чини! |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Ну, в Характере у тебя итак целая портянка свойств. Я вообще когда писал, подразумевал просто что "ты знаешь" в какой ячейке вектора у тебя шляпа а в какой левый наколенник. Но если подходить более основательно, я бы завел в характере свойство equipment и написал класс дата-обжекта (а то и менеджера) для хранения именованых свойств-слотов. Может быть, это даже пригодится тебе в дальнейшем, если захочется врагов тоже экипировать. Плюс в этот класс можно даже какие-то несложные расчеты делегировать, типа обобщений веса, резистов, цены и тп. В любом случае, даже добавление/удаление предметов требует какой-то логики, и мне кажется нет смысла расписывать ее в классе Характера, поскольку это вполне себе отдельный феномен Экипировка, достойный своего управляющего класса.
Добавлено через 2 минуты Про кольца и амулеты не забудь))))
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
О да! Меня уже самого пугает. Из-за этого уже всю систему статус-эффектов вынес в отдельный статус-менеджер (что кстати уже оправдало себя, так как выяснилось, что статус-эффекты могут действовать не только на персонажей).
Цитата:
У меня ещё тупой вопрос. Не даёт мне покоя потенциальная проблема с двойным счётом эффектов от шмотья, занимающего сразу несколько слотов, которую я выше упомянул (типа куртка с капюшоном "болтается" и в torso, и в head). Как лучше: завести отдельный массив, куда тупо сваливать всё "надетое" и считать суммарный вес/эффекты по нему или заморачиваться с логикой при анализе содержимого слотов?
__________________
Не сломано - не чини! |
|
|||||
Регистрация: Jul 2014
Сообщений: 42
|
Мне думается, что у персонажа скорее всего 1 голова, две ноги, 2 руки(10 пальцев для колец), 1 туловище. Если это куртка с капюшоном, то она занимает два слота - туловище и голову. Если это кофта/майка/нагрудный доспех - только туловище.
+ несколько слотов под амулеты + какой-нибудь пояс для артефактов или что там потребуется. Предмет сам о себе говорит для каких слотов он предназначается. И при установке уже забиваем слоты предметом. Точнее даже нет никаких слотов. Есть интерфейс - и он будет отрисовывать все шмотьё по своим местам, если внешний вид персонажа, который тоже отрисует все шмотье по свойствам шмотья, есть какой-нибудь менеджер установки шмотья, который сообщит, что невозможно надеть куртку с капюшоном, потому что уже надета шапка и кофта(т.е. для Head и Body/Torso установлено значение true - занято). Не вижу смысла в разных слотах-массивах, если есть предметы с двойными свойствами. Скорее, один массив + булевы значения слотов занятости. Последний раз редактировалось DEVORON; 30.05.2018 в 11:46. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Добавлено через 5 минут Цитата:
Добавлено через 10 минут При добавлении одёжки-мультислота тоже будет парадокс: типа удалил шляпу и добавил в этот слот мантию с капюшоном. Но она заняла и слот куртки и слот брюк, а тебе надо проверить эти слоты после шляпы, потому что в мантии указаны три занимаемых слота. Ты проверяешь слот куртки и удаляешь мантию))) и добавляешь ее в слот куртки? а потом та же история со слотом штанов. Удаляешь мантию из слота штанов и добавляешь туда мантию. Процессы то не всегда одноточечные, иногда они пошаговые))) Но ты разберешься.
__________________
Reality.getBounds(this); |
Часовой пояс GMT +4, время: 22:30. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|