DeadStar — продолжаю улучшать механизм работы с картой. За выходные переделал систему из своего поста. Оказалось, для отображения айтемов на миникарте нужно хранить всю инфо о комнатах (их положение в матрице + ширину, высоту). Сделал как говорил ксит — прошёлся по кмнатам и снял все параметры. Теперь даже переходы на миникарте ставятся автоматом по комнатам. Я только матрицу с комантами задаю.
- 21 июля 2019, 21:52
- 03
То есть теперь я могу натолкать на карту комнаты, а специальный скрипт зная метаданные о комнатах сам расставит схематично переходы. Т.к. я знаю координаты верхнего угла на карте для ВСЕХ комнат то в своих рассчётах при переходах я могу напрямую обращаться к структуре которая хранить эти координаты, а не высчитывать.
Правда немного поднапрягся делая проход по комнатам в самом начале. Прикол в том, что у каждой комнаты есть инициализация. Но есть и событие Room Start, которое запускается перед событием иницализации. И ещё нужно было комнаты фильтрануть, чтобы всякие менюшки не попали в рассчёт. Все игровые комнаты я назвал по шаблону room_l0_<название комнаты>, где l0 - обозначает локацию 0. Так что я фильтранул по "room_l" чтобы получить название комнаты.
На неделе буду делать таскание и запоминание трупов и врагов буду готовить для тестового билда. Уже примерно разбил их на фракции. И в тестовом билде игрок будет сражаться с противниками системы NOD, подкласса Copperneedle. Может быть ещё сделаю пару вражин из другого подкласса. Hidingrass или Gravedog.
Может быть кто-то и смекнёт чем я вдохновлялся придумывая названия подклассов =)
Сложновато. NOD это была фракция в Tiberian Sun, но ты не об этом, скорее что-то из мира вирусов-антивирусов.
У меня это NODES. Система распределена по узлам и на самом деле аналог коллективного разума.
Фууххх, задолбался соптыкаться об подводные камни. То что в теории выглядело простым:
На деле оказалось не таким уж и простым, но вроде бы я это запилил. Таскаемые объекты остаются там где игрок их в последний раз видел/оставил.
Если кому интересно то сделал я это как примерно и предполагал: есть список непостоянных объектов. Как только игрока заходит в комнату с таким объектом, то он прописывается в этот список и в следующий раз самоуничтожится как только поймёт что попал в список. По ID, который <имя комнаты>-<xstart>-<ystart>.
В этом супер-списке непостоянных объектов хранится доп-инфа о каждом объекте - его настоящее местоположение, координаты, слой, название ассета, экстра-переменная. При входе в комнату проверяется этот список и если в нём есть объекты, чьё настоящее местоположение является эта комната - он создаётся в нужной позиции на нужном слое, с экстра-переменной. Зачем эта переменная? Например, идентификатор трупа, чтобы знать какая комната цифрового мира ему соответствует. Когда игрок перетаскивает объект - я обновляю координаты и комнату в супер-списке непостоянных объектов. Такие дела.
Немного попотел над структурой этого супер-списка. Не сразу было понятно что нужно. И попарился аккуратно прописывая места обновления положений и локаций.
Зато теперь у меня есть список, который я буду использовать для сохранения и загрузки игры оставляя объекты на тех местах где их оставил игрок. Даже при смене локации.
Правда я ещё не сделал возможность складывать эти объекты в инвентарь корабля. Некоторые можно будет, но это уже в довольно далёкой реализации. Пока таскаит можно только трупы и основы. Трупы можно будет только воскресить, а основы только восстановить.
А как идентификатор трупа помогает отыскать комнату? Ты как-то шиворот-навыворот это сделал... либо описал. Либо я не понял, поясни ещё раз зачем экстра-переменная вообще, а не только в случае идентификации трупа. (какие-то оперативно-розыскные разговоры пошли однако)
Я задаю ID комнаты в Variable Definitions у трупа прямо внутри комнаты. Если я создаю объект просто так, то эта комната прописывается дефолтная. Но ведь у меня его объект начинает храниться в списке и чтобы не проебать этот ID, когда я создаю труп в другой комнате, у меня есть эта переменная которая хранит ID комнаты.
Но не только для этого. Основы, которые игрок оставляет после своей смерти имеют порядковый номер. И мне нужно чтобы игрок восстанавливал именну ту основу, которую потерял. Этот номер так же будет храниться в этой переменной.
Хм... Да, теперь более понятно, хотя "основы" это не устоявшийся игровой термин и читается всё СЛОЖНОВАТО. В общем, делай!
А утром по-быстрому сделал возрождение врагов как в соусе. Это было изи, т.к. часть функционала я использовал из таскания трупов. Тоже список объектов, но мне не нужно их никуда таскать, так что тут проще - только проверить на старте комнате есть ли враг в списке убитых, если есть - по-тихому его уничтожить.