И всем снова добрый день!
Где-то между работой у меня время от времени находилось пару часиков свободных, и вот наконец насобиралось достаточно материала для нового поста.
Продолжил я свою работу с того, что попробовал ввести плагин LiteTween для перемещения карт, как мне посоветовал господин @LIMOR. Спасибо тебе огромное за совет! Плагин работает отлично!
Протестировав его на отдельной сцене, я занялся переносом в основную сцену. Но тут я заметил, что у меня большинство событий связанных с картами, очень похожи друг на друга, и отличие состоит только в их положении.
Так что я решил сразу оптимизировать код заменой шести разных карт на одну, но в шести экземплярах и с новым поведением.
Для начала я расположил шесть экземпляров карт, ввёл локальную переменную под названием Position, на которой будет завязано перемещение на свои места, и через неё пронумеровал экземпляры.
Затем я попробовал сразу в настройках поведения вставить формулу для нахождения цели пути.
И у меня ничего не получилось. Похоже в настройки поведений и прочего можно писать только числа, ибо всё, что выглядит как формула, прогой игнорируется.
Так что теперь координаты цели (Target) движения каждой карты присваиваются отдельной строкой действия.
Кстати, когда я включал движение карты, в качестве опции старта следует указывать Start from the beginning, ибо когда я выбрал Resume at current progress с мыслью, что карта как бы продолжит свой путь, она сразу телепортировалась в конец пути.
Кроме того при данном положении дел у меня карты постоянно открывались по новой, ибо событие остановки постоянно выполнялось. Так что увеличиваю координаты финиша на 2 и по прибытию сдвигаю на 2 назад.
На этом этапе движения карт меня очень даже удовлетворяло, так что прошлые объекты карт я удалил.
Также в ходе тестов я выяснил, что плагин поведения LiteTween двигает карту не с постоянной скоростью, как Pathfinding, а с постоянным временем движения. Т.е. если раньше у меня все карты двигались с одинаковой скоростью и при одновременном старте первая карта всегда приходила раньше последней, то с данным поведением постоянное время пути, и независимо от позиции все карты одновременно стартуют и одновременно финишируют. Из-за этого все карты у меня "открывались" одновременно и были одинаковыми.
Поэтому на старте сцены я присваиваю карте скорость, завязанную на переменной позиции. Таким образом, каждый экземпляр карты будет двигаться разное количество времени и будет открываться по очереди.
Далее у меня выскочил баг при перетасовке колоды, когда в последовательность карт включался ноль, и по итогу у меня в некоторые моменты карта попросту не открывалась.
Причина этого была в том, что в функции перетасовки колоды есть проверка на то, есть ли новое рандомное число в массиве или нет, и поскольку до замены все ячейки массива заняты ненулевыми значениями, ноль вполне подходил.
Исправил я этот баг очисткой массива последовательности карт перед перетасовкой и присвоением первым шести ячейчкам значений уже открытых карт.
Далее я занялся эффектами карт заклинаний, ведь именно для это они и нужны, верно?
Начал я с заполнения массива свойств карт. Поскольку с помощью кода заполнять массив каждый раз при начале сцены или игры в целом будет слишком долго (карт ведь будет намного-намного больше, чем 8) я подумал, что самым оптимальным решением будет сделать файл со свойствами карт и просто его подргужать.
Так что для начала я занялся созданием этого самого файла. Немного погуглив я нашёл видео с примером и сделал аналогично (если кому нужно будет, могу ссылку дать).
В отдельной сцене со своим листом событий я прописал действия на заполнение ячеек с последующим сохранением массива в файл *.json
При тесте этой сцены у меня в загрузки сохранялся следующий файл.
Далее я загрузил этот файл в проект в раздел файлов.
Подгрузкой файлов в Construct 2 занимается объект AJAX, так что для начала я добавил его и при старте сцены дал ему команду на загрузку файла со свойствами.
И отдельным событием на завершение загрузки этого файла добавил действие на заполнение массива свойств карт заклинаний.
Проверяем!
При правильном составлении листа событий я получил правильную подгрузку массива.
Далее нужно создать объекты, на которые будут влиять заклинания.
В первую очередь я продублировал объекты волшебника и щита на свой и вражеский, и добавил каждому локальную переменную здоровья. А также добавил текстовые индикаторы здоровья.
Поскольку в далёком далёком будущем я планирую дать игрокам возможность развивать своих волшебников, то при старте сцены я прописал действия на присвоение параметров здоровья и вывод их на индикатор.
Также я хочу, чтобы если здоровье щита было нулевым, его просто не было видно, и наоборот, при максимальном значении он будет самым ярким. Так что также прописал зависимость прозрачности щита от его здоровья.
Немного подумав, я перенёс присвоение текста индикаторам здоровья в ежетиковое событие.
Далее я попробовал дать карте первое свойство: когда используем карту заклинания, увеличивающего прочность, здоровье волшебника увеличивается.
Поскольку я хочу, что бы заклинание подействовало уже когда карта будет между волшебниками, я вставил это действие в событие прибытия карты на своё место.
И вот тут я снова столкнулся с проблемой длительного выполнения события. Здоровье волшебника постоянно возрастало, пока карта была посередине.
Более того, в ходе попыток это исправить я нашёл ещё баг: одна карта у меня часто повторялась после перетасовки.
Причину я нашёл немного позже, случайно вспомнив, что в массиве свойств карт я оставил себе пустой столбец. Дело в том, что массив нумерует свои строки, столбцы и выдвижные ящички (в глубину по Z, как секретер с картотекой в какой-нибудь поликлинике) начиная с нуля. А для собственного удобства я пописывал значения первой карты в столбец 1, второй - столбец 2, и т.д. пропустив столбец 0.
Так что при старте сцены задаём ширину массива последовательности на 1 меньше, чем ширина массива свойств карт.
А баг длительного увеличения здоровья я решил переместив строку выполнения заклинания в событие нажатия карты, как единомоментное событие, с небольшой задержкой на перемещение карты.
Далее!
Заклинания не могут выполнятся за просто так. Так что я ввёл волшебникам 4 новые локальные переменные на энергию каждой стихии и ввёл на каждую переменную свой индикатор энергии аналогично индикатору здоровья (скрин забыл сделать).
Далее мне нужно было прописать действие вычета стоимости заклинания из соответствующей энергии. Но тут я столкнулся с проблемой, что массив свойств я заполнял ещё 12 дней назад и я совершенно не помню за что какая строка отвечала. Так что я пересоздал табличку свойств по новой, заодно добавив в нулевой столбец назначения каждой строки.
И далее для применения свойств карты я прописал по действию на каждою строку массива свойств (для начала на те, которые заполнены хоть немного).
Возможно кто-то скажет, что так выйдет дофига строк, много кода, который будет работать и на нулевые ячейки тоже. Но мне этот вариант кажется более целесообразным, чем на каждую карту прописывать её свойства отдельно.
С таким подходом я получил универсальные 20 строк, которые будут работать абсолютно для каждого заклинания.
И оно действительно работает.
И напоследок я добавил также условие, при котором заклинание не может использоваться, если соответствующей энергии будет недостаточно. Для того, что бы было видно, что заклинание не сработало, я добавил в карту поведение Sine и сделал подрагивание по горизонтали.
На данный момент это все изменения. В дальнейшем я планирую добавить остальные карты базовой колоды и попробую настроить анимацию волшебника и возможность передачи хода противнику.
Спасибо, что прочитали до конца, и до следующего поста.