Linderdaum इंजन का उपयोग कर Android विकास

नमस्कार हेब्रोसोसिटी!

C ++ में Android के लिए एप्लिकेशन लिखने का विषय अवांछनीय रूप से भुला दिया गया है। आज हम सीखेंगे कि लिंडरडैम इंजन का उपयोग करके मल्टी-प्लेटफ़ॉर्म एंड्रॉइड एप्लिकेशन कैसे लिखें।


Linderdaum SDK 0.6.08 के साथ संगतता का समर्थन करने के लिए अपडेट किया गया पोस्ट

1. निर्माण प्रक्रिया की स्थापना

Linderdaum इंजन के साथ काम करने के लिए, आपको सबसे पहले स्थापित करने की आवश्यकता है:

इसके अलावा, सीधे एंड्रॉइड के तहत निर्माण करने के लिए, आपको अतिरिक्त रूप से स्थापित लोगों की आवश्यकता है:

उपरोक्त सभी को स्थापित करें। हम एक फ़ोल्डर में लिंडरडैम एसडीके स्थापित करते हैं जिसके नाम पर रिक्त स्थान नहीं हैं (अन्यथा एंड्रॉइड एनडीके के साथ समस्याएं होंगी)। लिंडरडैम एसडीके में आपके पास पुस्तकालयों को संकलित रूप में संकलित करने की आवश्यकता है (वे Libs.Win32 / Libs.Win64 और BuildAndroid / jni / armeabi-v7a में हैं), इसलिए बस मेटा जानकारी को अपडेट करें और फ़ाइलों का निर्माण करें। एसडीके के साथ डायरेक्ट्री से लॉन्च करें सबसे पहले rebuildLSD.py, और फिर makeconfig.py। यही है - अब आप हमारे पहले मल्टी-प्लेटफ़ॉर्म एप्लिकेशन को लिखना शुरू कर सकते हैं।

2. हमारा HelloAndroid ऐप

इंजन विवरणों के साथ लोड नहीं होने के लिए, लेकिन बहु-प्लेटफार्मों पर अधिक विस्तार से रहने के लिए, इस न्यूनतम 3 डी एप्लिकेशन पर विचार करें जो हमने ऐप्स / Test_Android / Src / 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) { //   LMatrix4 Trans( Trackball.GetRotationMatrix() * Camera->GetCamera().GetModelViewMatrix() ); Scene->SetCameraTransform( Trans ); Scene->SetCameraProjection( Projection ); //   Scene->SetUseOffscreenBuffer( false, false ); Scene->RenderForward(); //    bool MousePressedL = Env->Console->IsKeyPressed( LK_LBUTTON ); Env->Viewport->UpdateTrackball( &Trackball, 10.0f, MousePressedL ); } void Update( LEvent Event, const LEventArgs& Args ) { //  Args.FFloatArg  DeltaTime   } APPLICATION_ENTRY_POINT { LString CommandLine; EXTRACT_COMMAND_LINE(CommandLine); Env = new sEnvironment(); // CommonMedia    PC,         Env->DeployDefaultEnvironment( CommandLine, "..\\..\\CommonMedia" ); Env->FileSystem->Mount("GameData"); Projection = Math::Perspective( 45.0f, Env->Viewport->GetAspectRatio(), 0.4f, 2000.0f ); //        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 ) ); //   Scene = Env->Linker->Instantiate("clScene"); //      int ID = Scene->AddGeom( Env->Resources->CreateIcosahedron( 3.0f, LVector3(0) ) ); //    clMaterial* Mtl = Env->Resources->CreateMaterial(); Mtl->SetPropertyValue( "DiffuseColor", "1.0 0.0 0.0 0" ); Mtl->SetPropertyValue( "CastShadow", "false" ); Scene->SetMtl( ID, Mtl ); //   Scene->SetLocalTransform( ID, LMatrix4::GetTranslateMatrix( LVector3( 0.0f, 0.0f, 0.0f ) ) ); Env->RunApplication( DEFAULT_CONSOLE_AUTOEXEC ); APPLICATION_EXIT_POINT( Env ); } APPLICATION_SHUTDOWN { } 


यह समझना मुश्किल नहीं है, इस कोड को स्क्रीन के केंद्र में लाल आइकोसैड्रोन को माउस के साथ घुमाने की क्षमता प्रदर्शित करनी चाहिए। और, जैसा कि हम चाहते हैं, इसे एंड्रॉइड डिवाइस पर और विंडोज के तहत पीसी पर बदलाव के बिना करना चाहिए। जल्दी से नहीं कहा।

3. विंडोज के तहत निर्माण

हम Linderdaum build system और auto-generate सभी build files का उपयोग करेंगे। हम खाली ऐप्स / Test_Android / makeconfig.py और Apps / Test_Android / jni / Android.mk फाइलें बनाते हैं - वे स्वतः उत्पन्न हो जाएंगे (हमें बाद में दूसरी आवश्यकता होगी, इसलिए हम इसे उसी समय बनाएंगे)। इंजन की जड़ पर जाएं और वहां से समाधान / regenerateconfigs.py चलाएँ। फिर makeconfig.py रन करें। Voila - .proproj / .vcxproj स्टूडियो के लिए फाइलें और gcc मेकफाइल तैयार हैं।

हम LinderdaumSDK_VS2008.sln (या LinderdaumSDK_VS2010.sln) को लोड करते हैं और समाधान के लिए Apps / Test_Android प्रोजेक्ट को जोड़ते हैं, Linderdaum इंजन पर निर्भरता रखना नहीं भूलते।

F5 दबाएं - लाल आइकोसैड्रोन के साथ एक विंडो दिखाई देती है (पृष्ठ के नीचे स्क्रीनशॉट देखें)।

PS उन लोगों के लिए जो विंडोज के तहत gcc का उपयोग करना चाहते हैं, बिल्डफीड को चलाने के लिए पर्याप्त है और मेकफाइल्स उत्पन्न करने के बाद थोड़ा इंतजार करें।

4. एंड्रॉइड के लिए इंजन का निर्माण

अब जब विंडोज पथ में महारत हासिल हो गई है, हम एंड्रॉइड के लिए एप्लिकेशन का निर्माण शुरू करने के लिए तैयार हैं। यह बहुत आसान है, लेकिन इसके लिए हमारे उपकरण स्थापित करने की आवश्यकता होगी:



आपको एंड्रॉइड के लिए इंजन बनाने की आवश्यकता है (libLinderdaumEngineCore.a पहले से ही SDK के साथ बंडल है, इसलिए मैन्युअल पुनर्निर्माण की आवश्यकता केवल तभी है जब आप इंजन में खुद को खोदना चाहते हैं)। Cygwin बैश शेल लॉन्च करें, BuildAndroid फ़ोल्डर पर जाएं और ndk-build -j4 कहें। हम थोड़ा इंतजार कर रहे हैं ... नतीजतन, libLinderdaumEngineCore.a का आकार 100 एमबी से थोड़ा अधिक होना चाहिए।

5. Android के लिए एक परियोजना बनाएँ

एंड्रॉइड के लिए हमारे मिनी-प्रोजेक्ट का निर्माण करने के लिए, Apps / Test_Android में कई और फ़ाइलों की आवश्यकता होती है। यहां आपको उन्हें लिखने की आवश्यकता है:

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


project.properties
target=android-13


local.properties
sdk.dir=< Android SDK, D:\\android-sdk-windows>


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-7
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -DANDROID
APP_ABI := armeabi-v7a


Android SDK से टूल का उपयोग करने के लिए, हमें AndroidManifest.xml मेनिफ़ेस्ट की आवश्यकता है। उदाहरण के लिए, इस तरह:

 <?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> 


भविष्य में, विभिन्न अनुप्रयोगों में लाइन पैकेज = "com.linderdaum.engine.myfirstandroidapp" बदलना न भूलें।

जब हम Apps \ Test_Android में जाते हैं और ygwin से ndk-build चलाते हैं, तो निम्न प्रदर्शित होना चाहिए:

 $ 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/armeabi-v7a/ Prebuilt : libFreeImage.a <= jni/../../../BuildAndroid/jni/armeabi-v7a/ Prebuilt : libFreeType.a <= jni/../../../BuildAndroid/jni/armeabi-v7a/ Prebuilt : libVorbis.a <= jni/../../../BuildAndroid/jni/armeabi-v7a/ Prebuilt : libOGG.a <= jni/../../../BuildAndroid/jni/armeabi-v7a/ Prebuilt : libOpenAL.a <= jni/../../../BuildAndroid/jni/armeabi-v7a/ Prebuilt : libModPlug.a <= jni/../../../BuildAndroid/jni/armeabi-v7a/ Prebuilt : libstdc++.a <= <NDK>/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/ SharedLibrary : libLinderdaumEngine.so Install : libLinderdaumEngine.so => libs/armeabi-v7a/libLinderdaumEngine.so 


हमने अपनी परियोजना के C ++ भाग के साथ समाप्त किया। यह जावा को समाप्त करने और .apk में वितरण का निर्माण करने के लिए बना हुआ है। ऐसा करने के लिए, हमें इस 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> 


एंटी-आम-मीडिया डिबग चलाएं और Apps \ Test_Android \ bin \ Test_Android-debug.apk में समाप्त वितरण प्राप्त करें। इसे डिवाइस पर कमांड के साथ इंस्टॉल किया जा सकता है:

adb स्थापित करें Test_Android-debug.apk

और एप्लिकेशन चलाएँ। यह इस तरह दिखाई देना चाहिए:

छवि

कुछ सुझाए गए सवालों के तुरंत जवाब दें:

1. क्या विंडोज के लिए एप्लिकेशन बनाना संभव है, विशेष रूप से डेस्कटॉप संस्करण के लिए? MacOS?
आप 32-बिट और 64-बिट संस्करणों के लिए, Windows XP / Vista / 7 के तहत एप्लिकेशन बना सकते हैं। इसके अलावा, एप्लिकेशन को एंड्रॉइड के लिए असेंबल करते समय गेम कोड में किसी भी बदलाव की आवश्यकता नहीं होगी, सब कुछ काम करेगा - दोनों ग्राफिक्स, ध्वनि, और बाकी सब। MacOS के लिए अभी तक इंजन के कोई संस्करण नहीं हैं।
2. क्या WP7 सपोर्ट / कब / है?
फिलहाल नहीं। Microsoft से इस प्लेटफ़ॉर्म के लिए C ++ API जारी करने के बाद WP7 के लिए समर्थन पर चर्चा की जा सकती है।
3. इंजन की तरफ से Android 2.1 / 2.2 / 2.3 / 3.0 के साथ क्या स्थिति है? मतभेद?
इंजन का C ++ और जावा भाग 2.1 और पुराने से शुरू होने वाले Android का समर्थन करता है। यदि आप 2.1 / 2.2 के साथ काम नहीं करेंगे, तो एक गेम के लिए जावा कोड लिखना चाहते हैं, तो मतभेद हो सकते हैं।
4. क्या NDK एंड्रॉइड पर इंजन को लागू करने के लिए उपयोग किया जाता है या जावा में इंजन कोड लिखा जाता है?
इंजन जावा में एक आवरण के साथ सी ++ में लिखा गया है और निर्माण के लिए एंड्रॉइड एनडीके का उपयोग करता है। C ++ कोड सभी समर्थित प्लेटफार्मों के तहत काम करता है।
5. इनपुट डिवाइस, मल्टी-टच, इंस्टेंट / बफर इनपुट पर "रैपर" कितने अच्छे हैं?
बहु-स्पर्श समर्थित। आपको स्वयं बफ़रिंग और जेस्चर पहचानना होगा।
6. 2 डी / 3 डी के लिए, केवल फिक्स्ड-फ़ंक्शन का उपयोग किया जाता है या शेडर्स का उपयोग करना संभव है?
इंजन OpenGL 3 / OpenGL ES 2 पर आधारित है और केवल शेड का उपयोग करता है। फिक्स्ड-फ़ंक्शन का उपयोग नहीं किया जा सकता है।
7. इंजन पर कौन से एप्लिकेशन पहले से लिखे गए हैं?
market.android.com/details?id=com.linderdaum.engine.puzzL
market.android.com/details?id=com.linderdaum.engine.multibricks_free
8. एक आवेदन बनाने के लिए इतने सारे पत्र क्यों हैं?
शैक्षणिक उद्देश्यों के लिए। उपरोक्त सभी Linderdaum SDK से ProjectWizard का उपयोग करके 5 क्लिक में किया जा सकता है।

इसके अलावा

एंड्रॉइड एप्लिकेशन को और भी तेज़ी से बनाने के लिए, प्रोजेक्ट विज़ार्ड लॉन्च करें, वहां हम चुनें:

अन्य विकल्प डिफ़ॉल्ट रूप से छोड़ दिए जाते हैं और जनरेट प्रोजेक्ट पर क्लिक करते हैं। वह सब है! अपने Android SDK को local.properties में पथ लिखना न भूलें।

Source: https://habr.com/ru/post/In121062/


All Articles