ื”ื›ื ืช ืคืจื•ื™ืงื˜ SDL2 ืœื”ืคืขืœื” ื‘ืื ื“ืจื•ืื™ื“

ืฉืœื•ื ืœื›ื•ืœื. ื”ื™ื•ื ื ื‘ื—ืŸ ื›ื™ืฆื“ ืœื”ื›ื™ืŸ ืคืจื•ื™ืงื˜ ื‘ืืžืฆืขื•ืช ืกืคืจื™ื™ืช sdl2 ืœื”ืคืขืœืช ืžืฉื—ืง ื‘ืื ื“ืจื•ืื™ื“.

ืจืืฉื™ืช ืขืœื™ืš ืœื”ื•ืจื™ื“ ืืช ืื ื“ืจื•ืื™ื“ ืกื˜ื•ื“ื™ื•, ืœื”ืชืงื™ืŸ ืื•ืชื• ื•ื›ืœ ืžื” ืฉื ื“ืจืฉ ื‘ืกื‘ื™ื‘ืช ืคื™ืชื•ื— ื–ื•. ืœื“ื•ื’ืžื”, ืขื›ืฉื™ื• ื™ืฉ ืœื™ Kde Neon, ื•ื‘ืžืขืจื›ืช ื”ื–ื• ื™ืฉ ืงื•ื‘ืฅ /etc/environment, ืื•ืชื• ืงื•ื‘ืฅ ืงื™ื™ื ื‘-ubuntu. ื™ืฉ ืœื”ื–ื™ืŸ ืฉื ืืช ื”ืžืฉืชื ื™ื ื”ื‘ืื™ื.

ANDROID_HOME=/home/username/Android/Sdk
ANDROID_NDK_HOME=/home/username/ndk

ืืชื” ื’ื ืฆืจื™ืš ืœื”ื•ืจื™ื“ ืืช NDK ืžื”ืืชืจ ื”ืจืฉืžื™, ืœืคืจื•ืง ืื•ืชื• ืœืกืคืจื™ื™ืช ื”ื‘ื™ืช ืฉืœืš ื•ืœืฉื ื•ืช ืืช ืฉืžื” ืœ-NDK. ืœืื—ืจ ืžื›ืŸ ืขืœื™ืš ืœื”ื•ืจื™ื“ ืืช ืกืคืจื™ื™ืช SDL2 ืžื”ืืชืจ libsdl.org. ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘-sdl2 ืœืื ื“ืจื•ืื™ื“, ื—ืฉื•ื‘ ืœื ืœืขืฉื•ืช ืงื•ืžืคื™ืœืฆื™ื” ืœืžื—ืฉื‘, ื›ื™ ืื– ื”ื•ื ืœื ื™ืงืžืคืœ ืœืื ื“ืจื•ืื™ื“. ื›ื“ื™ ืฉื”ืคืจื•ื™ืงื˜ ื™ืชื‘ืฆืข ืงื•ืžืคื™ืœืฆื™ื”, ืขืœื™ืš ืœื™ืฆื•ืจ ืคืจื•ื™ืงื˜ ื‘- android studio, ื›ืœ ืื—ื“, ื›ื“ื™ ืœืงื‘ืœ ืืช ื”ืจื™ืฉื™ื•ืŸ, ืื—ืจืช SDL2 ื™ื‘ืงืฉ ืจื™ืฉื™ื•ืŸ ื‘ืขืช โ€‹โ€‹ื”ื‘ื ื™ื™ื”.

ื›ื“ื™ ืœืงืจื•ื ืงื‘ืฆื™ื ื‘ืื ื“ืจื•ืื™ื“ ืžื ื›ืกื™ื, ืขืœื™ืš ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื•ืช 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: %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

ื™ืฆืจืชื™ ื’ื ืงื•ื‘ืฅ ื›ื•ืชืจืช ืœื—ื™ื‘ื•ืจ ื›ื•ืชืจื•ืช SDL2. ื™ืฉ ืฆื•ืจืš ื‘-NO_SDL_GLEXT ื›ื“ื™ ืฉื”ืงื•ืžืคื™ืœืฆื™ื” ืชืฆืœื™ื— ื‘ืื ื“ืจื•ืื™ื“.

#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

ืื– ื”ืคืจื•ื™ืงื˜ ืžื•ื›ืŸ, ื”-shaders ืžื•ื›ื ื™ื ืขื‘ื•ืจ Opengl Es 3.0. ื›ืขืช ืขืœื™ื ื• ืœื™ืฆื•ืจ ืคืจื•ื™ืงื˜ ืื ื“ืจื•ืื™ื“. ืœืฉื ื›ืš, ืคืจืง ืืช ืืจื›ื™ื•ืŸ SDL2. ืขื‘ื•ืจ ืืœ ื‘ื ื™ื™ืช ืกืงืจื™ืคื˜ื™ื. ื•ืื ื—ื ื• ืขื•ืฉื™ื ืืช ื–ื” ื›ื›ื”.

./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 ืœืื ื“ืจื•ืื™ื“, ืื‘ืœ ื–ื” ืœื ืขื‘ื“, ื”ื™ื™ืชื™ ืฆืจื™ืš ืœืฉื ื•ืช ืžืฉื”ื•. ืื ื• ื’ื ื™ื•ืฆืจื™ื ืืคืœื™ืงืฆื™ื™ืช ืกืคืจื™ื™ื”/src/main/assets. ืื ื• ืฉืžื™ื ื‘ื• ืืช ื”ืžืฉืื‘ื™ื ืฉืœื ื• (ื’ื•ืคื ื™ื, ืกืคืจื™ื™ื˜ื™ื, ืžื•ื“ืœื™ื ืชืœืช ืžื™ืžื“ื™ื™ื).

ืขื›ืฉื™ื• ื‘ื•ืื• ื ื’ื“ื™ืจ ืืช Freetype2 ืขื‘ื•ืจ ืื ื“ืจื•ืื™ื“. ื”ื•ืจื“ ืžื”-github ืฉืœื™ ืงื™ืฉื•ืจ, ื•ื”ืขืชืง ืืช ืกืคืจื™ื™ืช Freetype2 ืœืกืคืจื™ื™ืช app/jni/. ื”ื›ืœ ืžื•ื›ืŸ. ื›ืขืช ื”ืคืขืœ ืืช ื”ืคืงื•ื“ื” ./gradlew installDebug ื‘-com.xverizex.test. ื›ื“ื™ ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœื”ื•ืกื™ืฃ ืืช ื”ืžืฉื—ืง ื”ื–ื” ืœืื ื“ืจื•ืื™ื“, ื ื™ืคื•ื™ ื‘ืื’ื™ื ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืžื•ืคืขืœ ื‘ืื ื“ืจื•ืื™ื“. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขืœื™ืš ืœืขื‘ื•ืจ ืœื”ื’ื“ืจื•ืช, ืœืœื›ืช ืœ"ืžืขืจื›ืช", ืœืœื›ืช ืœ"ืื•ื“ื•ืช ื”ื˜ืื‘ืœื˜" ื•ืœืœื—ื•ืฅ ืขืœ ื”ืืคืฉืจื•ืช "ืžืกืคืจ ื‘ื ื™ื™ื”" ื‘ืขืจืš ืฉืฉ ืคืขืžื™ื. ืœืื—ืจ ืžื›ืŸ ื—ื–ื•ืจ ื•ืชื•ืคื™ืข ื”ืืคืฉืจื•ืช ืœืžืคืชื—ื™ื. ื”ื™ื›ื ืกื• ื•ื”ืคืขื™ืœื• ืื•ืชื•, ื”ืคืขืœ ื’ื ืืช ืืคืฉืจื•ืช "ื ื™ืคื•ื™ ื‘ืื’ื™ื USB". ืขื›ืฉื™ื• ืืชื” ืฆืจื™ืš ืœื”ืฉื™ื’ ืžืคืชื— ืœื˜ืื‘ืœื˜. ืœืฉื ื›ืš, ื”ืชืงืŸ ืืช ืชื•ื›ื ื™ืช adb. ืื ื• ืžืคืขื™ืœื™ื ืืช ืžืขื˜ืคืช ื”-adb ื‘ืงื•ื ืกื•ืœื”, ื•ืžืคืชื— ื‘ื˜ืื‘ืœื˜ ืฉื—ื™ื™ื‘ ืœื”ืชืงื‘ืœ. ื–ื”ื•, ื›ืขืช ื ื™ืชืŸ ืœื”ื•ืจื™ื“ ืžืฉื—ืงื™ื ืœื˜ืื‘ืœื˜ ืฉืœืš.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”