crypt of decay - October 4th, 2017 [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

October 4th, 2017

мысли и идеи [Oct. 4th, 2017|03:27 pm]
поскольку сеть у нас в D2D:F сделана, но не лучшим образом (фактически, нахачена сверху; сам по себе хак годный — для условий и сроков, в которые был сделан, но), то сеть тоже надо переделывать, конечно.

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

до меня дошло, что и не надо. можно оставить рабочие структуры игры почти что intact, и просто реализовать поверх них нечто вроде proxy entities. таким образом логику игры не придётся шибко перепиливать (разве что подобавлять в некоторых стратегических местах флагов типа «что-то в объекте поменялось», их уже коге-где и так есть). и перевести кусок, который ведает взаимодействием с игроком, с прямой работы с объектами на проксики. таким образом относительно малой болью получается унификация клиентского кода для локальной и сетевой игры. слой же управления собственно логикой остаётся почти без изменений, только уезжает чуть ниже.

то есть, клиентской части становится пофигу, интерполировает ли кто-то внизу данные с сервера, или это local game: он пинает прокси, получает с них данные и все дела.

для рендера будет кодовый путь, который на основе полученых с сервера entities создаёт dummy objects, заполненые по минимуму: лишь бы рендер работал. или не создаёт ничего, если у нас local game.

в игре есть ещё split screen, и он тоже отлично ложится в эту схему. ну, два локальных клиента создадим, делов-то. хоть сорок два.

дельта-снапшоты тоже будут генерироватся из проксиков: они (проксики) спокойно могут хранить прошлое состояние полей, которым нужна синхронизация, внутри себя, и сравнивать с новыми, выплёвывая только изменения. или выплёвывать всё, если это «нулевой пациент». таких полей всё равно немного: в основном координаты и скорость объектов. ну, и animation state для анимированых панелей, потому что оные панели иногда используются в картах для катсцен, например.

код от этого красивей, конечно, не станет, но зато позволит мне делать entity system параллельно с существующей логикой, имея при этом рабочую игру. а когда я более-менее допилю — переключиться на новые механизмы (даже переключаясь на новые куски частично и постепенно, в принципе).

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


сразу отвечу на незаданые вопросы.

1. код игры сам по себе адский ад. ну, так исторически сложилось: оригинальный автор начинал её делать, будучи ещё нубом. а потом там наслаивалось и наслаивалось. если кто делал проекты, которые живут кучу лет, и начинались как нубокод, а дропать их нельзя — тот может примерно представить, что там внутри.

2. идея «сесть и переписать всё с нуля как надо» была неоднократно. проблемы две. мелкая: надо соблюсти оригинальную физику и квирки 1:1, потому что есть карты, которые заточены под эту механику. и крупная: перепись никогда не завершится. потому что когда есть игра, в которую можно поиграть, то это мотивирует, да и если бросить работу на пол-пути, то у нас всё ещё будет игра, в которую можно поиграть. а если делать с нуля, то игры не будет очень долго, и если бросить перепись, то весь новый код можно смело слить в мусорку, он бесполезен. поэтому переписи не будет никогда, скорее всего. поэтому же игра остаётся на пацкалике.

3. сетки изначально в игре не просто не было: игра даже никогда не задумывалась как сетевая. соответственно, никакого разделения данных на клиент/сервер там нет, все оперируют всем. теперешняя сеть нахачена сверху. мой будущий хак тоже хак, по духу такой же, как тот, что есть, но по сути красивей.
Link7 meows|meow!

FlexBox layouting with autowrap [Oct. 4th, 2017|06:28 pm]
хм. а ведь похоже, что я ступил.

чтобы реализовать автоперенос детей, когда кончилось место, надо просто отказаться от модели «сначала вызовем `layBox()` для каждого ребёнка, а потом пораскладываем детей», и сделать стадии раскладывателя пошаговыми.

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

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

итого, получаем схему, которая гарантировано всё утрясёт, и даже сделает автопереносы.

идея сырая, конечно, надо нарастить на неё мяса и сделать PoC… но очень похожа на рабочую.

также, если у нас есть контролы с hgroup/vgroup, то после того, как раскладыватель всё разложил, проходимся по ним, и если какой-то контрол нужно увеличить, то увеличиваем, скидываем размеры всех негруппированых контролов в начальные, и раскладываем заново. рано или поздно всё это перестанет расти, и расклад сойдётся.

конечно, такое многопроходное раскладывание далеко не самое быстрое, но пофигу: это двигатель для GUI, а не для уеб-страниц, поэтому в нём не будет тысяч контролов, и он не будет вызываться на каждом кадре (потому что immediate UI идёт в жопу). ну, потратит он какие-то миллисекунды (или даже десятки миллисекунд, гы) на то, чтобы всё разложить — и пусть.

код при этом почти не должен вырасти в размерах: всё равно теперешний раскладыватель делает почти то же самое. просто вместо «всё и сразу» куски будут разнесены по разным функциям. подумаешь. на самом деле, код даже может стать понятней, потому что вместо одной большой функции-простыни будут маленькие «строительные блоки».

если я это реализую, и оно заработает так, как я рассчитываю, то Эталонную Реализацию FlexBox-Раскладывателя можно будет считать завершённой, и готовой к использованию везде, где понадобится. а благодаря grouping-фиче она ещё и спокойно заменит собой grid layouter — единственный тип раскладывания, который флексты без группировки сейчас толково не умеют. то есть, это будет именно тот Идеальный Раскладыватель, который нужен любой гуи-библиотеке. а поскольку он оперирует только ящиками и размерами, то ему плевать, что раскладывать, и его можно будет прикручивать куда угодно: просто сделать прокси-объект, который сначала даст раскладывателю начальные параметры, а в конце получит от раскладывателя итоговые — и всё, прикручивание к новой библиотеке гуёв завершено.

ура мне, ура: я изобрёл очередной Охуительный Велосипед! который наверняка уже придумали много лет назад — но меня это не волнует, я известный велосипедостроитель.
Linkmeow!

navigation
[ viewing | October 4th, 2017 ]
[ go | Previous Day|Next Day ]