Дата начала разработки: 10 августа 2021 года.

Содержание


Среда разработки

В качестве среды разработки был выбран бесплатный кроссплатформенный движок Solar2D v2021.3649 (бывший Corona SDK) от компании Corona Labs Inc. При разработке приложений используется язык Lua v5.4.3 – по идеологии и реализации язык ближе всего к JavaScript.

Официальные логотипы
Официальные логотипы

Solar2D обладает полноценным симулятором и простейшей консолью отладки. Также присутствует очень удобная функция Live Build – тестирование приложения одновременно на нескольких устройствах и разных платформах в режиме реального времени. Для работы данной функции необходимо, чтобы компьютер и устройство были подключены к одной локальной сети.

«Просто как по волшебству.»

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

Но встречается и русскоязычная информация:

Есть и русскоязычные видео:

Немного примеров проектов:


Интерфейс

В файле config.lua задаются параметры конфигурации. Среди таких параметров задаётся и метод масштабирования. Был выбран метод «adaptive», который выбирает ширину и высоту динамического содержимого в зависимости от устройства.

application = {
  content = {
    scale = "adaptive",
  }
}

В связи с особенностями данного метода для заданий размеров и положений объектов необходимо использовать свойства display.contentWidth и display.contentHeight, а также расчёты с этими свойствами. Для этого в файле main.lua, который является основным файлом любой программы, написанной на Solar2D, были заданы глобальные переменные:

_W = display.contentWidth
_H = display.contentHeight
_CenterX = display.contentCenterX
_CenterY = display.contentCenterY

На основе вышеизложенного реализовано главное меню.

Главное меню
Главное меню
Эффект нажатия кнопки главного меню
Эффект нажатия кнопки главного меню

Положение кнопок по вертикали задаётся универсальной формулой:

buttonHeight*lengthTable(buttons) + ((_H - buttonHeight*5)/6)*(lengthTable(buttons) - 1)

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

Также разработаны окна паузы и подтверждения выхода из игры. Дизайн данных окон не является конечным.

Окно паузы
Окно паузы
Окно подтверждения выхода из игры
Окно подтверждения выхода из игры

Параметры сборки приложения указываются в файле build.settings. Так как игра будет в горизонтальном положении, то укажем начальную ориентацию, а также допустимые варианты ориентации экрана:

settings = {
  orientation = {
    default = "landscapeRight",
    supported = {"landscapeRight", "landscapeLeft"}
  }
}

В этом же файле можно задать и заставку при открытии приложения. Дизайн заставки не является конечным.

settings = {
  splashScreen = {
    enable = true,
    image = "Images/launchScreen.png"
  }
}
Заставка
Заставка

Реализована пробная иконка приложения как для API уровня <26 (Android 7.0 и ниже), так и для API уровня ≥26 (Android 8.0 и выше). Для этого по пути AndroidResources/res/ созданы и правильно названы соответствующие файлы иконок для разных плотностей экранов Android.


Настройки – звуки, музыка, локализация

Ещё одним разделом в файле build.settings является раздел настроек сборки для устройств Android.

settings = {
  android = {
    isGame = true,
    minSdkVersion = "15",
    versionCode = "1"
  }
}

Здесь для Google Play классифицируется приложение, как игра. Указывается минимальная версия SDK. Минимальный уровень API в Solar2D – 15 (Android 4.0.3). Также внутренний номер версии. Этот номер используется для определения более новой версии приложения – более высокие числа указывают на более новую версию приложения. Данная строка будет обычным инкрементом при выпуске новых версий.

В экране настроек реализовано изменение громкости звуков и фоновой музыки, а также локализация всего текста игры. Язык текста меняется в режиме реального времени, и никаких перезапусков не требуется.

Окно настроек
Окно настроек

Положение текста над ручками слайдеров будет исправлено.

На данный момент игра планируется на 4-х языках:

  • Русский

  • English

  • Deutsch

  • Українська

Реализованы звуки шагов персонажа, нажатий на различные кнопки. Реализована фоновая музыка. Звуки и музыка не являются конечным.

Экран настроек также можно вызвать из окна паузы во время игры. Дизайн окна настроек не является конечным.

Сохранение всех настроек производится с помощью метода системной функции:

system.setPreferences("app", table)

Графика

Реализована анимация движения главного героя.

Анимация движения главного героя
Анимация движения главного героя

Начата разработка карты для первой главы сюжета.

Начальный этап разработки карты
Начальный этап разработки карты

Управление

Реализован джойстик для управления главным героем.

Джойстик управления главным героем
Джойстик управления главным героем

Для созданий джойстика был создан отдельный модуль joystick.lua вида:

local class = {}

function class.createJoystick()
  -- function body
end

return class

Из основного файла джойстик создаётся следующим образом:

local moduleJoystick = require("Module.joystick")

function scene:create(event)
  local joystick = moduleJoystick.createJoystick()
end

scene:addEventListener("create", scene)

return scene

Смена анимации движения главного героя происходит при пересечений центром джойстика линий ± 45° с проверкой на текущее значение последовательности кадров для предотвращения бесконечной смены анимации. Схематично это выглядит так:

Схема смены анимации движения главного героя
Схема смены анимации движения главного героя

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

Схема возможных касаний и желаемых положений центра джойстика
Схема возможных касаний и желаемых положений центра джойстика

Для этого была решена геометрическая задача. Имеем центр джойстика (x1,y1) и точку касания по экрану, которая вышла за джойстик (x2,y2). Необходимо найти точку на окружности (x3,y3).

Геометрическая задача для желаемого положения центра джойстика
Геометрическая задача для желаемого положения центра джойстика

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

Математические формулы положения центра джойстика:

\alpha = \arctan\left(\frac{y_2 - y_1}{x_2 - x_1}\right),a = y_3 = \sin\left(\alpha\right)\cdot r_1 + y_1,b = c_3 = \cos\left(\alpha\right)\cdot r_1 + x_1.
local alfa = math.atan(deltaY/deltaX)

centerJoystick.x = math.cos(alfa)*radiusBgJoystic*sign(deltaX) + centerJoystickPositionX
centerJoystick.y = math.sin(alfa)*radiusBgJoystic*sign(deltaX) + centerJoystickPositionY

В переменной deltaX записывается величина отклонения по оси X точки касания по экрану от центра фона джойстика. Аналогично, и deltaY. Соответственно, sign(deltaX) информирует о движении влево или вправо от центра фона джойстика.

Сейчас начать движение можно только проведя по фону джойстика, но в планах добавить возможность начать движение и по клику на фон джойстика.

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

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

Реализована коллизия карты и главного героя, которая предотвращает движение главного героя в местах, где движение по логике невозможно – стены, обрывы, горы, здания, предметы интерьера. Для наглядности и тестирования видимость коллизии включена.

Коллизия карты и главного героя
Коллизия карты и главного героя

Реализовано сохранение позиций карты, игрока, объектов. При повторном открытии игровой сцены всё будет, как и перед выходом.


Объекты и инвентарь

Добавлены объекты основной валюты: болты и монеты. Дизайн объектов не является конечным. Был создан файл JSON записями вида:

{
  "type": {
    "name": "",
    "icon": "path",
    "description": ""
  },
}

Solar2D поддерживает JSON5, в котором добавлена возможность добавлять комментарии, а так же возможность не удалять запятую при копировании у последнего элемента.

Болт и монета
Болт и монета

Реализован инвентарь. Дизайн окна инвентаря не является конечным. А также создан JSON файл инвентаря вида:

{
  "item**": {
    "type": "",
    "count": 0
  },
}
Инвентарь
Инвентарь
Другая выбранная ячейка в инвентаре
Другая выбранная ячейка в инвентаре

Обязательно будет добавлена локализация объектов получаемых из JSON файла всех объектов.

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

В планах отключать анимацию монеты при выходе её за пределы экрана.

Монета на сцене
Монета на сцене

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


Итоги

Данный Developer Blog показывает объём работы, выполненный за первый месяц работы над игрой, включая знакомство со средой разработки и языком программирования. На текущий момент больших сложностей со средой разработки и языком программирования пока не возникало.

Все желающие могут протестировать всё реализованное, скачав документ ниже.

APK: Скачать

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

fas.offical@ya.ru

Об идеях и предложениях пока рано говорить, но в будущем мы обязательно постараемся выслушать мнение аудитории. А пока будут исправляться моменты, которые были указаны в данном Developer Blog, а также будет начато программирование первой главы сюжета.

Комментарии (6)


  1. kovserg
    26.09.2021 15:25

    А чем Solar2D лучше например Löve2D


    1. Cepera_C_A Автор
      04.10.2021 12:48

      Для сравнения всегда нужно поработать с обоими движками. Так как я не работал с Love2D, поэтому не могу сказать. Но по первому взгляду оба движка похожи: предназначены для 2D игр, используют язык Lua, похожая документация, а также легки в использовании. Как и при сравнении любых других продуктов, определённо, будут выявлены как плюсы, так и минусы обоих движков.


  1. flashkosta
    20.10.2021 16:50

    А почему не Unity, Godot? Самому очень нравится Solar2d. Интересна идеология со стороны) И еще интересно рассуждение по поводу того, насколько есть будущее у этого движка и есть ли где то статистика актуальная по проценту использования его в настоящее время разработчиками?


    1. Cepera_C_A Автор
      20.10.2021 17:24

      Unity, Godot – это игровые движки, поддерживающие разработку 3D игр. Мне же захотелось познакомиться с движком именно для 2D игр/программ. Но как я говорил ранее: при сравнении любых продуктов, определённо, будут выявлены как плюсы, так и минусы. В связи с отсутствием у Solar2D визуального редактора для кого-то работа с этим движком возможно будет немного сложнее.

      Будущее у движка однозначно есть – 2D игры никогда не пропадут, не говоря уже про программы. Разработчики активно работают над движком, выпуская по несколько обновлений и доработок в месяц. Также благоприятно для будущего движка играет роль русская документация и простота работы с языком Lua – это может сподвигнуть наших «маленьких» разработчиков использовать движок для воплощения своих идей.

      В Google Play на текущий момент более 2 тысяч приложений написанных на движке Solar2D с общим количеством загрузок более 3 миллиардов. В процентном соотношении это 0.28% приложений и 0.35% установок. Наиболее высокий процент (4.08%) приложений написанных на движке Solar2D в категории «Образовательные».

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


      1. moshamiracle
        26.10.2021 13:30

        В Google Play на текущий момент более 2 тысяч приложений написанных на движке Solar2D с общим количеством загрузок более 3 миллиардов.

        А как можно посмотреть эту статистику по разным движкам?


        1. Cepera_C_A Автор
          26.10.2021 13:32

          Данную статистику я взял с сайта AppBrain.