Hallo zusammen. Heute schauen wir uns an, wie man mit der SDL2-Bibliothek ein Projekt vorbereitet, um ein Spiel auf Android auszuführen.
Zuerst müssen Sie Android Studio herunterladen, installieren und alles, was in dieser Entwicklungsumgebung erforderlich ist. Ich habe zum Beispiel jetzt Kde Neon und auf diesem System gibt es eine Datei /etc/environment, die gleiche Datei existiert in Ubuntu. Dort müssen folgende Variablen eingetragen werden.
ANDROID_HOME=/home/username/Android/Sdk
ANDROID_NDK_HOME=/home/username/ndk
Sie müssen NDK außerdem von der offiziellen Website herunterladen, es in Ihr Home-Verzeichnis entpacken und in NDK umbenennen. Als nächstes müssen Sie die SDL2-Bibliothek von der Website herunterladen
Um Dateien in Android aus Assets zu lesen, müssen Sie die SDL_RWops-Funktionen verwenden. Hier ist ein Beispiel für die Verwendung im Code zum Arbeiten mit einer Schriftart. In diesem Fall können wir FT_New_Face nicht verwenden, sondern verwenden stattdessen FT_New_Memory_Face, um die bereits gelesenen Daten zu verwenden.
#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: %sn", 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
Ich habe auch eine Header-Datei erstellt, um SDL2-Header zu verbinden. NO_SDL_GLEXT ist für eine erfolgreiche Kompilierung auf Android erforderlich.
#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
Das Projekt ist also fertig, die Shader sind bereit für Opengl Es 3.0. Jetzt müssen wir ein Android-Projekt erstellen. Entpacken Sie dazu das SDL2-Archiv. Gehen Sie zu Build-Skripte. Und wir machen es so.
./androidbuild.sh com.xverizex.test main.cpp
Die folgende Meldung wird angezeigt.
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
Gehen Sie zu com.xverizex.test. Gehen Sie zu com.xverizex.test/app/jni/src. Wir kopieren unser Spielprojekt. Und wir ändern die Android.mk-Datei, in meinem Fall sieht sie so aus.
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)
Wie Sie vielleicht schon bemerkt haben, binde ich auch die Freetype2-Bibliothek ein. Ich habe auf Github ein fertiges für Android gefunden, aber es hat nicht funktioniert, ich musste etwas ändern. Wir erstellen auch ein Verzeichnis app/src/main/assets. Darin platzieren wir unsere Ressourcen (Schriftarten, Sprites, 3D-Modelle).
Jetzt konfigurieren wir Freetype2 für Android. Von meinem Github herunterladen
Source: habr.com