» » Прогресс за 16 августа

Прогресс за 16 августа

Автор: tapok от 17-08-2013, 07:21


2

Сегодня было много работы. Мы с Бартом, как обычно, фиксили баги, было, в общем, скучновато. Вот краткий список, а потом я расскажу про кое-что более интересное.

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

Ок, теперь насчет багов.

Бартве улучшил систему обработки ошибок в версии для винды, теперь стало легче проследить, из-за чего возникла ошибка. Это хоть и не багфикс, но определенно поможет фиксить баги. Потом он исправил то, что цифры урона иногда отображались слишком мелко. Потом я улучшил систему подсчета урона от окружающей среды, когда у персонажа не полная жизнь. Потом он еще кое-что пофиксил, но об этом потом. Я исправил несколько мелких недоработок. Да, и Барт ещё исправил генерацию частиц в анимации врагов. Ну и ещё несколько опечаток, неточностей в коде, и так, подчистили все по мелочам.

С утра я работал как раз над второй сумкой. Потом я пофиксил проекцию лазерного луча лучевого топора. Затем еще исправил ошибки интерфейса с некорректной регистрацией панелей. После этого я фиксил баг, когда система крафта не видела ресурсы в новой сумке, но когда я его исправил, появился новый баг: после крафта ресурсы из сумки не исчезали. Я программист от Бога, короче.

Может, вы замечали в стримах, что когда перс использует лучевой топор, его рука иногда странно дергается. Это исправили. А, ну и если навести указатель на самого персонажа, его руку начинало колбасить, как ужа на сковородке. Это тоже пофиксили. Кроме того я исправил еще несколько багов с инвентарем, на которых я остановлюсь позже, ну и сделал чтобы при загрузке игры, персонаж не забывал, что у него было в руках.

Потом пару багов подкинул Джордж, который заметил, что окно навигации не сворачивается и разворачивается, как надо. Короче, там тоже пофиксили пару багов. Потом я добавил фичу, чтобы по шифт-клику предмет из инвентаря перемещался на быструю панель. Осталось придумать, как сделать, чтобы было удобно и быстро брать предметы в левую и правую руку. Есть идеи?

Ох, реально долгий был день.

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

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


Что вы могли сразу заметить, так это то, что L и R – это отдельные слоты, которые могут содержать предметы, а не просто показывающие, какой слот на быстрой панели сейчас активен. Но, как вы помните, в игре много двуручных предметов, как быть с ними? Короче, теперь один из слотов просто деактивируется, если во второй положить что-нибудь двуручное. Но предмет из этого слота не убирается.
Прогресс за 16 августа


Нам показалось, что так будет разумнее, чем каждый раз автоматически убирать второй предмет в инвентарь. А вдруг там для него нет места?

«Подождите-ка!» — скажете вы – «Омни, ты опять все сломал! Ты охреневший кусок конской задницы, какой смысл в остальных слотах, если теперь, чтобы воспользоваться предметом, его надо перекладывать в слоты L и R? Ты упоротый сын ишака и тостера! И когда уже выйдет бета? Вы запарили со скучными отчётами, ты хоть сам понял, чё написал? Кто это читать будет вообще? Совсем охренели там, нахапали на предзаказах два ляма, и всё, можно не работать?»

«Воу воу воу, палехче,» – отвечу я – «Можно будет быстро переключаться между слотами!
Прогресс за 16 августа


Ну и, как видмте, это работает и с двуручными предметами».
Прогресс за 16 августа


Давайте теперь я расскажу, как это все устроено под капотом.

Панель управляется файлом /source/frontend/StarActionBar.hpp и прилагаемым к нему файлом ccp, эти файлы определяют панель как объект, который входит в состав MainInterface по адресу /source/frontend/StarMainInterface.hpp. В этом файле содержится почти весь интерфейс. Инвентарь, который тоже к этому всему относится, лежит по адресу /source/game/StarPlayerInventory.hpp, и понадобилось много чего модить, чтобы все это нормально устроить.

Давайте пройдемся от изменений самого низкого уровня до самых высокоуровневых фиксов и начнем со StarPlayerInventory.

В класс инвентаря пришлось внести 2 крупных изменения, чтобы все работало как надо. Во-первых, пришлось, естественно, добавить 2 дополнительных слота. Для простоты они будут существовать отдельно от других слотов быстрой панели. Они называются тупо “LeftHand” и “RightHand.” Во-вторых, я создал концепт «Активного» слота. Раньше инвентарь просто запоминал, какой по номеру предмет сейчас активный, теперь для этого существует отдельный параметр. Вообще-то эту фичу еще не врубили, но в будущем она поможет предотвратить множество багов, потому что можно будет слоту присвотить параметр «Активный», а не просто хранить в памяти инфу типа «активный сейчас предмет номер такой-то в сумке номер такой-то».

Итак! Мы имеем четыре разных слота, в которых могут находиться разные предметы, и два из этих слотов могут принимать три состояния, а остальные два – четыре. Слоты для левой и правой рук могут содержать либо одноручный предмет, либо двуручный, либо ничего. А левый и правый «активные» слоты могут содержать одноручный предмет, двуручный, быть пустыми, но выбранными или вообще пустыми и невыбранными.

Это подводит нас к следующему вопросу. Как определяется, какой предмет будет отображаться в левой руке, а какой – в правой? На самом деле, это не так-то просто, потому что может быть 144 возможные комбинации параметров. Так что единственное, что можно было сделать – это прописать, что будет происходить в каждом отдельном случае. И благодаря этому будет проще отлавливать баги, потому как будет предельно ясно, как все должно работать. Весь алгоритм можно проследить по таблице.

Легенда к таблице:
AE = Альтернативный Активный предмет, AH = предмет во второй руке
PE = Основной Активный предмет, PH = предмет в первой руке
2 = двуручный предмет
1 = одноручный предмет
0 = пустой слот
N = не выбрано (только для активных предметов)

(Таблицу и легенду результатов смотрим на сайте разработчиков, потому что наш сайт её отображает некорректно).

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

(Как это выглядит в виде кода, энтузиасты и на голову больные тоже смотрят на сайте разработчиков).

Ну и дела! Непросто сделать, чтобы всё работало как надо, особенно при условии, что мы посылали две роты чертей узнавать, как надо, и все вернулись с открытыми осложнёнными переломами обеих ног в двух-трёх местах. Состояние тяжёлое, надежды на полное выздоровление нет. Черти, скорее всего, никогда больше не смогут играть в футбол, и им придётся заново учиться ходить. Но вот что им ценой таких нечеловеческих жертв удалось выяснить: у вас, например, выбран основной активный слот, но там ничего нет, а вот во вторую руку у вас взят двуручный предмет. Вообще должно быть, что оба слота при этом неактивны, но я решил, что это будет некруто, и сделал так, чтобы отображался предмет из второй руки. Это не соответствует основному алгоритму, но черти, которые более-менее оправились от шока, утверждают, что так будет правильно.

Давайте теперь поговорим про быструю панель. Мы добавили полную её поддержку со стороны инвентаря, и теперь надо сделать кое-что с самой панелью. Во-первых сделать, чтобы слоты L и R на самом деле были интерактивными слотами для предметов. То есть, если на них нажать, должно что-то происходить, то есть если слот не активен, он активируется, а если он и так уже выбран, то предмет в нем используется.

А что с остальными предметами на панели? Тут все немного сложнее. Есть три способа выбрать предмет в качестве активного. Но только ОДИН из них управляется самим интерфейсом панели. Остальные два управляются через основной интерфейс, так как тут надо перехватывать нажатия клавиш и кнопок мыши, которые не имеют отношения к панели.

Но всё немного сложнее, чем просто запуск кода из StarActionBar.cpp. Основной интерфейс должен отслеживать три разные вещи. Во-первых, три иконки:
Прогресс за 16 августаПрогресс за 16 августаПрогресс за 16 августа

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

Все эти три значения похожи, но работают немного по разному принципу. Так что они должны отслеживаться отдельно. Так что каждый раз, когда я что-то делаю, то если нужно, один из этих параметров, или все сразу, обновляются. Если вы на самом деле дочитали до этого места, значит, вы офигенный чел. Кто первый напишет в комментах на форуме «StarActionBar.cpp», тому вышлю бесплатный ключ на игру. (Расслабьтесь, ребята, ключ уже давно забрали). Пока что я не придумал, как сделать, чтобы это всё было взаимосвязано. Но, по крайней мере, мне пока удалось всё сделать нормально с первого раза. Это до первой проверки на баги, конечно.

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

Когда вы крутите колесико мыши, или нажимаете кнопки с цифрами, это обрабатывается основным интерфейсом. Код похожий, но проще, потому что вариантов тут меньше. Все три параметра при этом, опять же, обновляются.

Короче, вот как процесс разработки выглядит с технической стороны. Задача сделать нормальную быструю панель заняла намного больше времени, чем я ожидал. Если вы смотрели мои стримы на прошлой неделе, вы помните, что 90% времени я занимался именно этим. Несколько раз я понимал, что делаю что-то не так, и приходилось начинать заново, поэтому получилось так долго. Но в итоге мне удалось нормально доделать инвентарь, и после этого всё стало намного проще. Короче, в итоге теперь все хорошо, но я чуть не склеил ласты, пока это делал.

В общем, пора мне закругляться, Надеюсь, вам было интересно читать этот талмуд. Вот вам в награду гифка.
Прогресс за 16 августа


Категория: Новости

Информация
Чтобы оставить комментарий, войдите с помощью , зарегистрируйтесь либо войдите на сайт под своим логином.

Комментарии

  • Публикаций: 0
  • Комментариев: 0
  • Рейтинг: 0
18 августа 2013 12:27
непонял belay а в чем смысл этой картинки
  • Публикаций: 0
  • Комментариев: 0
  • Рейтинг: 0
18 августа 2013 14:59
виталик,
Она офигенна!
Ваш кэп:новость мягко говоря не доделана._.

Добавить комментарий

Информация
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.