Membuat Game berbasis C++ Android NDK Menggunakan Linderdaum Engine pada Arsitektur Intel

Membuat Game berbasis C++ Android NDK Menggunakan Linderdaum Engine pada Arsitektur Intel

Linderdaum Engine adalah sebuah game engine 3D yang bersifat open source dan murni berorientasi obyek untuk platform Microsoft Windows, Google Android, dan Blackberry OS 10 yang ditulis dalam bahasa pemrograman C++. Game engine ini dirancang untuk menjadi solusi terpadu dalam pengembangan aplikasi 3D interaktif, game, industri, dan visualisasi ilmiah.

Mengatur Proses Pengembangan

Untuk pengembangan game menggunakan Linderdarum Engine, pertama-tama kamu perlu menginstal:

  • Linderdaum Engine SDK 0.6.08
  • OpenAL
  • Python* 3 (dibutuhkan versi 3 atau terbaru)

Sebagai tambahan, kamu juga perlu menginstal perangkat lunak berikut untuk membangun proyek-proyek di Android:

Selanjutnya, kamu perlu memiliki perangkat dengan sistem operasi Android 2.2 atau versi terbarunya untuk menguji produk yang dikembangkan. Supaya Android NDK dapat berjalan dengan baik, nama folder tempat kamu menginstal Linderdaum SDK sebaiknya tidak memiliki spasi.

Linderdium SDK dapat membangun library dalam bentuk yang telah dikompilasi (masukkan Libs.Win32/Libs.Win64 dan BuildAndroid/jni), sehingga yang harus kamu lakukan adalah melakukan pembaruan meta-information dan membangun file.

Pertama-tama jalankan biner dari repositori dengan SDK menggunakan rebuildLSD.py dan kemudian makeconfig.py. Sekarang kamu telah memiliki yang dibutuhkan untuk pengembangan dan kamu dapat mulai menulis aplikasi lintas platform.

Aplikasi HelloAndroid

Supaya tidak membebani bagian-bagian dari engine dan untuk menguraikan aspek-aspek lintas platform, maka kita akan bekerja dengan aplikasi 3D yang minimal di Apps / Test_Android / Src / file dan kodenya akan ditunjukkan pada bagian di bawah ini :

Test_Android.cpp:
#include "Linderdaum.h"
sEnvironment* Env = NULL;
LMatrix4              Projection;
clVirtualTrackball    Trackball;
clGameCamera*         Camera = NULL;
clScene*              Scene  = NULL;
void DrawOverlay(LEvent Event, const LEventArgs& Args)
{
    // refresh camera
    LMatrix4 Trans( Trackball.GetRotationMatrix() * Camera->GetCamera().GetModelViewMatrix() );
    Scene->SetCameraTransform( Trans );
    Scene->SetCameraProjection( Projection );

    // draw the scene
    Scene->SetUseOffscreenBuffer( false, false );
    Scene->RenderForward();

    // update the virtual trackball
    bool MousePressedL = Env->Console->IsKeyPressed( LK_LBUTTON );
    Env->Viewport->UpdateTrackball( &Trackball, 10.0f, MousePressedL );
}

void Update( LEvent Event, const LEventArgs& Args )
{
    // in Args.FFloatArg —Ö—Ä–į–Ĺ–ł—ā—Ā—Ź DeltaTime in milliseconds
}

APPLICATION_ENTRY_POINT
{
    LString CommandLine;
    EXTRACT_COMMAND_LINE(CommandLine);
    Env = new sEnvironment();

    // CommonMedia used only on the PC, on Android, it is cleverly packaged in resources
    Env->DeployDefaultEnvironment( CommandLine, "..\..\CommonMedia" );
    Env->FileSystem->Mount("GameData");
    Projection = Math::Perspective( 45.0f, Env->Viewport->GetAspectRatio(), 0.4f, 2000.0f );

    // create a camera and assign it to events
    Camera = Env->Linker->Instantiate( "clGameCamera" );
    Camera->GetCamera().SetPosition( LVector3(0,-10,10) );
    CONNECTOBJ( L_EVENT_TIMER, &clGameCamera::Event_TIMER, Camera );
    Env->Connect( L_EVENT_DRAWOVERLAY, Utils::Bind( &DrawOverlay ) );
    Env->Connect( L_EVENT_TIMER,       Utils::Bind( &Update      ) );

    // create a scene
    Scene = Env->Linker->Instantiate("clScene");

    // and add it to the mesh
    int ID = Scene->AddGeom( Env->Resources->CreateIcosahedron( 3.0f, LVector3(0) ) );

    // set up the material
    clMaterial* Mtl = Env->Resources->CreateMaterial();
    Mtl->SetPropertyValue( "DiffuseColor", "1.0 0.0 0.0 0" );
    Mtl->SetPropertyValue( "CastShadow",   "false" );
    Scene->SetMtl( ID, Mtl );

    // set the position
    Scene->SetLocalTransform( ID, LMatrix4::GetTranslateMatrix( LVector3(  0.0f, 0.0f, 0.0f ) ) );
    Env->RunApplication( DEFAULT_CONSOLE_AUTOEXEC );
    APPLICATION_EXIT_POINT( Env );
}

APPLICATION_SHUTDOWN
{
}

Kode ini akan menampilkan icosahedron merah di tengah layar yang dapat diputar dengan mouse. Kita juga ingin membangun aplikasi tanpa harus membuat perubahan pada perangkat Android atau PC Windows.

Membangun Engine untuk Android

Bisa dibilang membangun aplikasi untuk Android itu mudah, namun kamu harus mengatur beberapa tool yang dibutuhkan terlebih dahulu:

  • Variabel lingkungan JAVA_HOME harus mengacu ke folder dengan JDK (Pada Ubuntu, biasanya folder JDK di /usr/lib/kvm/default-java)
  • Variabel lingkungan NDK_ROOT harus mengacu ke folder dengan Android NDK
  • Berkas Apps / Test_Android / local.properties perlu menentukan parameter ‘sdk.dir =’ menunjuk ke folder dengan Android SDK

Selanjutnya, kita perlu membangun engine untuk Android (disertai SDK dan yang sedang digunakan libLinderdaumEngineCore.a sehingga kamu dapat membangun kembali secara manual apabila kamu ingin mengetahui lebih mendalam tentang engine yang dimiliki kamu ).

Jalankan Cygwin Bash Shell, menuju direktori, dan ketik BuildAndroid ndk-build -j4. Hasilnya, kamu akan melihat libLinderdaumEngineCore.a lebih besar dari 100 MB.

Membangun Proyek untuk Android

Membangun sebuah proyek Android memerlukan perubahan pada beberapa file di Apps/Test_Android. Berikut ini merupakan perubahan yang perlu kamu buat:

ant.properties
android.library.reference.1=..\\\\..\\\\BuildAndroid

project.properties
target=android-21

local.properties
sdk.dir=<path to Android SDK, for example C:\\android-sdk>

res\values\strings.xml
<?xml version="1.0" encoding="utf-8"?>
  <resources>
      <string name="app_name">Test_Android</string>
  </resources>

jni\Application.mk
APP_OPTIM := release
APP_PLATFORM := android-21
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti 
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -DANDROID
APP_ABI := x86

Untuk menggunakan tool dari Android SDK, kamu membutuhkan manifesto AndroidManifest.xml. Contohnya dapat anda lihat sebagai berikut:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.linderdaum.engine.myfirstandroidapp"
      android:versionCode="1"
      android:versionName="0.6.00"
      android:installLocation="auto">
    <!--require Android 2.1 and higher-->
    <uses-sdk android:minSdkVersion="7" />
    <uses-sdk android:targetSdkVersion="9" />
    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:anyDensity="true" />
    <uses-feature android:glEsVersion="0x00020000"/>
    <uses-feature android:name="android.hardware.telephony" android:required="false" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application android:label="@string/app_name"
                 android:installLocation="preferExternal"
                 android:debuggable="false">
        <activity android:name="com.linderdaum.engine.LinderdaumEngineActivity"
                  android:launchMode="singleTask"
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:screenOrientation="landscape"
                  android:configChanges="orientation|keyboardHidden"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Dalam aplikasi yang berbeda, kamu mungkin perlu mengubah paket=¬ęcom.linderdaum.engine.myfirstandroidapp¬Ľ. Pergi ke Apps\Test_Android dan jalankan ndk-build pada Cygwin. Kamu dapat mengikuti langkah berikut :

$ ndk-build
Compile++ thumb  : LinderdaumEngine <= LAndroid.cpp
Compile thumb  : LinderdaumEngine <= LJNI.c
Compile++ thumb  : LinderdaumEngine <= Test_Android.cpp
Prebuilt       : libLinderdaumEngineCore.a <= jni/../../../BuildAndroid/obj/local/x86/
Prebuilt       : libFreeImage.a <= jni/../../../BuildAndroid/jni/x86/
Prebuilt       : libFreeType.a <= jni/../../../BuildAndroid/jni/x86/
Prebuilt       : libVorbis.a <= jni/../../../BuildAndroid/jni/x86/
Prebuilt       : libOGG.a <= jni/../../../BuildAndroid/jni/x86/
Prebuilt       : libOpenAL.a <= jni/../../../BuildAndroid/jni/x86/
Prebuilt       : libModPlug.a <= jni/../../../BuildAndroid/jni/x86/
Prebuilt       : libstdc++.a <= /sources/cxx-stl/gnu-libstdc++/libs/x86/
SharedLibrary  : libLinderdaumEngine.so
Install        : libLinderdaumEngine.so => libs/armeabi-v7a/libLinderdaumEngine.so

Ini merupakan bagian akhir dari bahasa pemrograman C++ dalam proyek ini. Kamu tetap perlu untuk menambahkan Java dan membangun distribusi di .apk. Untuk itu, kamu perlu membuat kode build.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="Asteroids" default="help">
    <import file="../../BuildAndroid/CommonMedia.xml"/>
    <property file="local.properties" />
    <property file="ant.properties" />
    <loadproperties srcFile="project.properties" />
    <fail
            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
            unless="sdk.dir"
    />
    <target name="copy-game-data">
    <!-- Game data -->
        <delete dir="assets"/>
        <copy todir="assets/Data">
            <fileset dir="GameData">
            </fileset>
        </copy>
        <copy todir="assets/Data">
            <fileset dir="Data">
            </fileset>
        </copy>
    </target>
    <import file="${sdk.dir}/tools/ant/build.xml" />
</project>

Jalankan ant copy-common-media debug dan bersiap-siap untuk distribusi di Apps\Test_Android\bin\Test_Android-debug.apk. Nantinya berkas APK ini bisa diinstal pada perangkat dengan menggunakan perintah :

adb install Test_Android-debug.apk

Jalankan aplikasi. Selanjutnya, kamu dapat melihat hasilnya seperti di bawah ini:

Android NDK Games

Artikel Terkait

* Artikel ini adalah hasil kerja sama dengan Intel Developer Zone. Artikel asli bisa dilihat di link ini.