Всем привет. Сегодня мы посмотрим как подготовить проект с использованием библиотеки sdl2 для запуска игры на android.
Для начала надо скачать Android Studio, установить её и всё что требуется в этой среде для разработки. Например у меня сейчас Kde Neon, и в этой системе существует файл /etc/environment, такой же файл есть и в ubuntu. Там надо прописать такие переменные.
Также надо скачать NDK с официального сайта распаковать его в домашний каталог и переименовать в NDK. Далее нужно скачать библиотеку SDL2 с сайта libsdl.org. Чтобы использовать sdl2 для android, важно не компилировать его для компьютера, потому что тогда это не скомпилируется для android. Чтобы проект скомпилировался, надо создать проект в android studio, любой, чтобы принять лицензию, иначе при сборке SDL2 будет просить лицензию.
Чтобы считывать файлы в android из assets, нужно использовать функции SDL_RWops. Вот пример использования в коде по работе со шрифтом. В этом случае мы не может использовать FT_New_Face, а вместо этого будем использовать FT_New_Memory_Face, чтобы использовать уже считанные данные.
Также я создал файл заголовок для подключения SDL2 заголовков. NO_SDL_GLEXT нужен, чтобы компиляция прошла успешно для Android.
Итак проект готов, шейдеры готовы для Opengl Es 3.0. Теперь надо создать android-project. Для этого распаковываем архив SDL2. Заходим в build-scripts. И выполняем так.
Появится такое сообщение.
Переходим в com.xverizex.test. Заходим в com.xverizex.test/app/jni/src. Копируем свой проект игры. И меняем файл Android.mk, в моём случае это выглядит так.
Как вы может уже заметили, я подключаю ещё библиотеку Freetype2. Я нашел уже готовую на github для android, но она не работала, нужно было кое что поменять. Также создаем каталог app/src/main/assets. В него помещаем наши ресурсы ( шрифты, спрайты, 3d модельки ).
Теперь настроим Freetype2 для Android. Скачиваем с моего github Link, и копируем каталог Freetype2 в каталог app/jni/. Всё готово. Теперь запускаем в com.xverizex.test команду ./gradlew installDebug. Чтобы можно было добавить в android эту игру, в android должна быть включена отладка. Для этого нужно перейти в настройки, перейти в «Система», перейти в «О планшете» и нажать около шести раз опцию «Номер сборки». Потом перейти назад и появиться опция для разработчиков. Заходим и включаем, также включаем опцию «Отладка по USB». Теперь надо получить ключ для планшета. Для этого устанавливаем программу adb. Запускаем в консоли adb shell, и в планшете появляется ключ, который надо принять. Всё, теперь игры можно загружать на планшет.
Для начала надо скачать Android Studio, установить её и всё что требуется в этой среде для разработки. Например у меня сейчас Kde Neon, и в этой системе существует файл /etc/environment, такой же файл есть и в ubuntu. Там надо прописать такие переменные.
ANDROID_HOME=/home/username/Android/Sdk
ANDROID_NDK_HOME=/home/username/ndk
Также надо скачать NDK с официального сайта распаковать его в домашний каталог и переименовать в NDK. Далее нужно скачать библиотеку SDL2 с сайта libsdl.org. Чтобы использовать sdl2 для android, важно не компилировать его для компьютера, потому что тогда это не скомпилируется для android. Чтобы проект скомпилировался, надо создать проект в android studio, любой, чтобы принять лицензию, иначе при сборке SDL2 будет просить лицензию.
Чтобы считывать файлы в android из assets, нужно использовать функции SDL_RWops. Вот пример использования в коде по работе со шрифтом. В этом случае мы не может использовать FT_New_Face, а вместо этого будем использовать FT_New_Memory_Face, чтобы использовать уже считанные данные.
#ifdef __ANDROID__
snprintf ( path, 254, "fonts/%s", file );
SDL_RWops *rw = SDL_RWFromFile(path, "r" );
char *memory = ( char * ) calloc ( rw->hidden.androidio.size, 1 );
SDL_RWread(rw, memory, 1, rw->hidden.androidio.size );
FT_New_Memory_Face(*this->ft_library, ( const FT_Byte * )memory, rw->hidden.androidio.size, 0, &this;->face );
SDL_RWclose(rw);
free ( memory );
#else
snprintf ( path, 254, "%s/fonts/%s", DEFAULT_ASSETS, file );
if ( access ( path, F_OK ) ) {
fprintf ( stderr, "not found font: %s\n", path );
exit ( EXIT_FAILURE );
}
struct stat st;
stat ( path, &st; );
FILE *rw = fopen ( path, "r" );
char *memory = ( char * ) calloc ( st.st_size, 1 );
fread ( memory, 1, st.st_size, rw );
FT_New_Memory_Face ( *this->ft_library, ( const FT_Byte * ) memory, st.st_size, 0, &this;->face );
fclose ( rw );
free ( memory );
#endif
Также я создал файл заголовок для подключения SDL2 заголовков. NO_SDL_GLEXT нужен, чтобы компиляция прошла успешно для Android.
#ifdef __ANDROID__
#include "SDL.h"
#include "SDL_video.h"
#include "SDL_events.h"
#define NO_SDL_GLEXT
#include "SDL_opengl.h"
#include "SDL_opengles2.h"
#else
#include <SDL2/SDL.h>
#include <SDL2/SDL_video.h>
#include <SDL2/SDL_opengl.h>
#include <SDL2/SDL_opengles2.h>
#endif
Итак проект готов, шейдеры готовы для Opengl Es 3.0. Теперь надо создать android-project. Для этого распаковываем архив SDL2. Заходим в build-scripts. И выполняем так.
./androidbuild.sh com.xverizex.test main.cpp
Появится такое сообщение.
To build and install to a device for testing, run the following:
cd /home/cf/programs/SDL2-2.0.10/build/com.xverizex.test
./gradlew installDebug
Переходим в com.xverizex.test. Заходим в com.xverizex.test/app/jni/src. Копируем свой проект игры. И меняем файл Android.mk, в моём случае это выглядит так.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
SDL_PATH := ../SDL
FREETYPE_PATH := ../Freetype2
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include $(LOCAL_PATH)/$(FREETYPE_PATH)/include
# Add your application source files here...
LOCAL_SRC_FILES := ./engine/lang.cpp ./engine/actor.cpp ./engine/sprite.cpp ./engine/shaders.cpp ./engine/box.cpp ./engine/menubox.cpp ./engine/load_manager.cpp ./engine/main.cpp ./engine/font.cpp ./engine/model.cpp ./engine/button.cpp ./theme.cpp ./level_manager.cpp ./menu/menu.cpp
LOCAL_SHARED_LIBRARIES := SDL2 Freetype2
LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog
include $(BUILD_SHARED_LIBRARY)
Как вы может уже заметили, я подключаю ещё библиотеку Freetype2. Я нашел уже готовую на github для android, но она не работала, нужно было кое что поменять. Также создаем каталог app/src/main/assets. В него помещаем наши ресурсы ( шрифты, спрайты, 3d модельки ).
Теперь настроим Freetype2 для Android. Скачиваем с моего github Link, и копируем каталог Freetype2 в каталог app/jni/. Всё готово. Теперь запускаем в com.xverizex.test команду ./gradlew installDebug. Чтобы можно было добавить в android эту игру, в android должна быть включена отладка. Для этого нужно перейти в настройки, перейти в «Система», перейти в «О планшете» и нажать около шести раз опцию «Номер сборки». Потом перейти назад и появиться опция для разработчиков. Заходим и включаем, также включаем опцию «Отладка по USB». Теперь надо получить ключ для планшета. Для этого устанавливаем программу adb. Запускаем в консоли adb shell, и в планшете появляется ключ, который надо принять. Всё, теперь игры можно загружать на планшет.
kovserg
Опять рисуем сову. Где детали-то? Шрифты хорошо, а где звук, png и всё такое.
xverizex Автор
Мда, я что-то об этом и не подумал. У меня этого в проекте нет, и я забыл об этом. Ну насчёт звука это понятно. Но зачем png? У меня есть утилита, которая переводит в собственный формат изображения png, чтобы рисунки было удобно загружать в игру. Ну в принципе, если посмотреть на то, как у меня сделана настройка Freetype2, можно сделать настройки с аналогичными библиотеками.
kovserg
Там же mixer, image и в них плагины (external): ogg, vorbis, zlib, mgp123, webp, png, и т.п.
И потом надо собрать под mips,arm,arm64,x86 или всё само?
xverizex Автор
Ну я как помню что если подключить SDL_mixer, то других зависимостей не нужно, но звук вроде будет только wav, про ogg не знаю. Под все платформы собирается само, главное указать архитектуры, но обычно можно взять готовый файл из своего же sdl, где написаны все архитектуры.