Рисование простых линий в Defold-е (статья в стиле ДЮ) и разумеется реклама игры
Я вас категорически приветствую (позаимствуем пару фраз у ДЮ). Чем бы еще поднять привлекательность статьи - а точно - было дело я же работал в Mytona-е, и периодически видел ролики The Day Before.
А эта статья на самом деле реклама моей игры, надо бы не забыть указать ссылку.
Итак в процессе разработки столкнулся с одной сложностью, которую не ожидал. Это рисование простой геометрии в движке Defold, а именно рисование линий. Казалось бы ведь наверняка можно было сделать функцию типа
Но такой функции нет. Хотя в дебаг режиме можно отрисовать линию
тут посылаем сигнал рендеру отрисовать линию, но она будет видна только в дебаг режиме.
И ты конечно же спросишь, для чего мне простая линия, (в это тревожное время суток) в наш век высоких технологий. И я незамедлительно отвечу - нужна она мне для отрисовки следа пули, точнее для осколков от бомбы. Вот такой.
Но кто-то может возразить, для этих вещей можно использовать систему частиц, которая в Defold-е присутствует. Разумеется я ее пытался применить, но результат меня не устроил
Оставлять осколки без следов не хотелось, поэтому пришлось рисовать линию. В просторах интернета быстро нашлось соответствующее расширение Defold-а для отрисовки геометрии.
Итак приступаем к разбору модуля. Для начала создаем текстуру и на ней рисуем линии. Вроде просто. Итак начинаем - создаем текстуру,
далее берем каждую частицу и в функции update(dt) отрисовываем линию - примерно так
и отрисовывается только один след, так как drawpixels.fill очищает всю текстуру и следы от предыдущих частиц, в результате видим мы только последний трейс. Создавать по текстуре для каждой частицы накладно. Надо сделать по другому: собрать все линии в один массив и на каждой итерации отрисовывать. Но Defold не объектно- ориентированный, а компонентный, тут все на сигналах. Когда мы создаем объект, у нас есть только id объекта. Мы не можем вызвать его функцию типа GetTracePositions() из вне. Соответственно, где то в модуле выше заводим данный массив и в функции update(dt) частиц заполняем его. И вот когда собрали все координаты линий у всех частиц можно и отрисовать. Результат:
Вот с этим уже можно релизится.
Из сложностей - Пришлось повозиться с размером и скейлом текстуры, и при заполнении массива линий заполняем так - допустим след из 5 линий. Значит надо 6 точек. Заводим на каждую частицу массив из 6 элементов и на каждом update(dt) сначала полностью заполняем, а затем новую добавляем, а последнюю удаляем. И каждый массив складываем в финальный. В результате получается массив массивов. И при отрисовке самую дальнюю линию рисую с альфой 0.5 (полупрозрачной) и далее альфу увеличиваю. В результате получается постепенно исчезающий трейс.
Сама игра из себя представляет арканоид, но не простой а с физикой: объекты не зафиксированы, а как бы парят в невесомости. Некоторые из них сбрасывают бомбы и оружие. Есть объекты боссы - при попадании в них создаются новые.
По началу были уровни схожие с классическими арканоидами с элементами кирпичами, потом добавил элементы круги, далее пошли боссы: кирпичище и кругище, позже добавил квадратные кирпичи из которых можно составлять пиксельные фигуры.
Например на рисунке выше можно разрушить скелетик и разбить пол литра пенного вдребезги, и я уже вижу твою реакцию.
и видос геймплея
ссылка на игру
Собственно вот и все, я пошел дублировать статью на пикабу.
А на сегодня все, до новых встреч.