Неделя 3 (октябрь 2): Меню рабочих.

Оглавление

Оказалось что чтобы сделать подсчет ролевого параметра постройки — его отображение в понятном мне виде — нужен интерфейс постройки. И главным меню этого интерфейса в тот момент стало меню рабочих. Это меню должно было выполнять ту же функцию назначения рабочих что и драг-н-дроп в мире, но в более удобном месте. Благо в Нastle Сastle тоже существует подобный интерфейс. Только неудобный.

Два горизонтальных списка на ландшафтном экране — не надо так.

Меню рабочих состоит из двух панелей: установленных рабочих и списка кандидатов на работу. Устанавливаются рабочие тоже драг-н-дропом. Ради этого, не очень полезного, честно говоря, дела я изучил родной юнитевый пример интерфейсного драг-н-дропа и постановил что он говно. Я еще со школы терпеть ненавижу примеры (о, как я плакал когда в распечатанном папой учебнике по 3D Studio Max обнаружилась нехватка страниц… а ведь мог бы сейчас моделлером быть) и вот я опять напоролся на пример, который говно.

Он был далековат от того, что мне было нужно, переносил только картинку, а не объект, встраивание объекта в перенос ломало переносчик, в общем у меня ничего не получилось. Боль, страдания, слезы, бан попытки обсудить с каким-то чувком на стаковерфлоу не такая же ли у него была проблема полтора года назад как у меня сейчас, снова слезы. Короче если у вас нет уже отработанного механизма драг-н-дропа, лучше обойдитесь без драг-н-дропа.

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

  • OnBeginDrag — начала драга. Это момент когда игрок нажимает левую кнопку мыши на картинке и начинает двигать курсор. Если курсор не сдвинется, то это будет как нажатие на кнопку.
  • OnDrag — процесс драга, когда игрок не отпуская левую кнопку мыши продолжает двигать курсор. Эта функция нужна чтобы менять координату картинки, на которую нажал игрок вслед за курсором.
  • OnEndDrag — окончание драга, когда игрок отпускает левую кнопку мыши. Эта функция вообще ничего не знает о том, где именно произошло окончание драга, так что все что мы можем тут сделать — это вернуть какое-то начальное состояние: убрать перемещаемую вместе с курсором картинку, например.
  • OnDrop — самая интересная функция. Она срабатывает в целевом объекте если курсор был отпущен когда находился поверх этого объекта.
  • Ну и еще там есть несколько других, иногда полезных, функций, на которые можно полюбоваться таки изучив пример.

И вот функция OnEndDrag вызывается раньше функции OnDrop. В результате если вы на окончании драга убиваете переносчик информации о переносимом объекте, то в дропе вы этой информации уже не дождетесь — она ведь уже уничтожена. А убивать его можно только после того как сработал или не сработал дроп… о чем мы не знаем. И вот либо мы убьем его в дропе (так как он если сработает, то сработает последним), либо вообще вынесем информацию о переносимом объекте в какую-нибудь глобальную статичную переменную (что я в итоге и сделал) чтобы разорвать связь между прекращением драга и существованием переносчика.

А мог бы вообще свой менеджер событий под это дело написать, например. Но не осилил. Хотя на самом деле это не сложно. Когда придет время с этой задачей справлюсь.

И очень рекомендую книгу Game Programming Pattertns. Даже если вы не программист и даже минимальными навыками не обладаете.

***

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

Пришлось заодно принять окончательное решение по поводу ресурсов — они тоже стали предметами в инвентаре.

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

Оглавление