NativeActivity से माइग्रेट करें Android गेम डेवलपमेंट किट का हिस्सा.
इस पेज पर, Google Analytics 4 प्रॉपर्टी से माइग्रेट करने का तरीका बताया गया है
NativeActivity
से
आपके Android गेम प्रोजेक्ट में GameActivity
.
GameActivity
, Android के NativeActivity
पर आधारित है
फ़्रेमवर्क में ये शामिल हैं:
- Jetpack से
Fragment
इस्तेमाल किए जा सकते हैं. - सॉफ़्ट कीबोर्ड इंटिग्रेशन के लिए,
TextInput
सहायता उपलब्ध है. - इसके बजाय,
GameActivity
Java क्लास में टच और मुख्य इवेंट को हैंडल करता हैNativeActivity
onInputEvent
का इंटरफ़ेस.
माइग्रेट करने से पहले, हमारा सुझाव है कि आप
'शुरू करें' गाइड, जिसमें बताया गया है कि
GameActivity
को अपने प्रोजेक्ट में सेट अप और इंटिग्रेट करें.
Java बिल्ड स्क्रिप्ट अपडेट
GameActivity
को इस तौर पर डिस्ट्रिब्यूट किया गया है
Jetpack लाइब्रेरी. पक्का करें कि Gradle स्क्रिप्ट को अपडेट करने के लिए, बताए गए चरणों को लागू किया गया हो
शुरुआती निर्देश में देखें:
अपने प्रोजेक्ट की
gradle.properties
फ़ाइल में Jetpack लाइब्रेरी चालू करें:android.useAndroidX=true
वैकल्पिक रूप से, एक ही
gradle.properties
फ़ाइल में, Prefab का कोई वर्शन बताएं, उदाहरण के लिए:android.prefabVersion=2.0.0
अपने ऐप्लिकेशन की
build.gradle
फ़ाइल में Prefab की सुविधा चालू करें:android { ... // other configurations buildFeatures.prefab true }
अपने ऐप्लिकेशन में
GameActivity
डिपेंडेंसी जोड़ें:core
औरgames-activity
लाइब्रेरी जोड़ें.- अगर आपका मौजूदा एपीआई लेवल 16 से कम है, तो उसे अपडेट करें कम से कम 16 तक.
- कंपाइल किए गए SDK वर्शन को उस वर्शन में अपडेट करें जिसे
games-activity
लाइब्रेरी की ज़रूरत है. आम तौर पर, Jetpack को SDK टूल के सबसे नए वर्शन की ज़रूरत होती है, ताकि रिलीज़ बिल्ड का समय.
आपकी अपडेट की गई
build.gradle
फ़ाइल कुछ ऐसी दिख सकती है:android { compiledSdkVersion 33 ... // other configurations. defaultConfig { minSdkVersion 16 } ... // other configurations. buildFeatures.prefab true } dependencies { implementation 'androidx.core:core:1.9.0' implementation 'androidx.games:games-activity:1.2.2' }
Kotlin या Java कोड के अपडेट
NativeActivity
को स्टार्टअप गतिविधि के तौर पर इस्तेमाल किया जा सकता है और इससे फ़ुल स्क्रीन बनती है
का इस्तेमाल करें. फ़िलहाल, GameActivity का इस्तेमाल स्टार्टअप के तौर पर नहीं किया जा सकता
गतिविधि. ऐप्लिकेशन को GameActivity
से क्लास हासिल करनी चाहिए और उसका इस्तेमाल इस तौर पर करना चाहिए
स्टार्टअप गतिविधि होगी. आपको कॉन्फ़िगरेशन में अतिरिक्त बदलाव भी करने होंगे,
फ़ुल स्क्रीन ऐप्लिकेशन बनाएं.
इन चरणों के मुताबिक, आपका ऐप्लिकेशन NativeActivity
को स्टार्टअप के तौर पर इस्तेमाल करता है
गतिविधि. अगर ऐसा नहीं है, तो इनमें से ज़्यादातर को स्किप किया जा सकता है.
नई स्टार्टअप गतिविधि को होस्ट करने के लिए, Kotlin या Java फ़ाइल बनाएं. उदाहरण के लिए, यह कोड,
MainActivity
को स्टार्टअप गतिविधि के तौर पर बनाता है और ऐप्लिकेशन की मुख्य स्थानीय लाइब्रेरी लोड करता है,libAndroidGame.so
:Kotlin
class MainActivity : GameActivity() { override fun onResume() { super.onResume() // Use the function recommended from the following page: // https://d.android.com/training/system-ui/immersive hideSystemBars() } companion object { init { System.loadLibrary("AndroidGame") } } }
Java
public class MainActivity extends GameActivity { protected void onResume() { super.onResume(); // Use the function recommended from // https://d.android.com/training/system-ui/immersive hideSystemBars(); } static { System.loadLibrary("AndroidGame"); } }
res\values\themes.xml
फ़ाइल में ऐप्लिकेशन की थीम फ़ुल स्क्रीन में बनाएं:<resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Application.Fullscreen" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item>" </style> </resources>
AndroidManifest.xml
फ़ाइल में ऐप्लिकेशन पर थीम लागू करें:<application android:theme=”@style/Application.Fullscreen”> <!-- other configurations not listed here. --> </application>
फ़ुल स्क्रीन मोड के बारे में ज़्यादा जानकारी पाने के लिए, ध्यान खींचने वाली गाइड और इनमें दी गई जानकारी को लागू करने का उदाहरण गेम के सैंपल रेपो.
डेटा दूसरी जगह भेजने की इस गाइड से, नेटिव लाइब्रेरी का नाम नहीं बदलता. अगर आप बदलाव करते हैं इसे ध्यान में रखते हुए, पक्का किया जा सकता है कि मूल लाइब्रेरी के नाम जगहें:
Kotlin या Java कोड:
System.loadLibrary(“AndroidGame”)
AndroidManifest.xml
:<meta-data android:name="android.app.lib_name" android:value="AndroidGame" />
C/C++ बिल्ड स्क्रिप्ट फ़ाइल के अंदर, उदाहरण के लिए
CMakeLists.txt
:add_library(AndroidGame ...)
C/C++ बिल्ड स्क्रिप्ट के अपडेट
इस सेक्शन में दिए गए निर्देशों में cmake
का इस्तेमाल उदाहरण के तौर पर किया गया है. अगर आपका आवेदन
ndk-build
का इस्तेमाल करता है, तो आपको उन्हें इनमें बताए गए मिलते-जुलते कमांड से मैप करना होगा
ndk-build दस्तावेज़ पेज.
GameActivity के C/C++ वर्शन ने उसे लागू करके सोर्स कोड रिलीज़ किया है. इसके बाद के वर्शन 1.2.2 में, स्टैटिक लाइब्रेरी रिलीज़ दी गई है. स्टैटिक लाइब्रेरी का सुझाया गया रिलीज़ टाइप दिया गया है.
रिलीज़ को एएआर में,
prefab
उपयोगिता. नेटिव कोड में, GameActivity के C/C++ सोर्स और
native_app_glue
कोड. उन्हें आपके परिवार के साथ मिलकर बनाया जाना चाहिए
ऐप्लिकेशन का C/C++ कोड शामिल करें.
NativeActivity
ऐप्लिकेशन पहले से ही native_app_glue
का इस्तेमाल कर रहे हैं
कोड NDK में भेजा गया. आपको इसे GameActivity के वर्शन से बदलना होगा
native_app_glue
पेज चुने जा सकते हैं. इसके अलावा, सभी cmake
चरण इसके अंदर दस्तावेज़ हैं
शुरुआती निर्देश लागू होंगे:
C/C++ स्थैतिक लाइब्रेरी या C/++ स्रोत कोड किया गया है.
स्टैटिक लाइब्रेरी
अपने प्रोजेक्ट की
CMakeLists.txt
फ़ाइल में,game-activity
स्टैटिक इंपोर्ट करें लाइब्रेरी कोgame-activity_static
प्रीफ़ैब मॉड्यूल में लाया है:find_package(game-activity REQUIRED CONFIG) target_link_libraries(${PROJECT_NAME} PUBLIC log android game-activity::game-activity_static)
सोर्स कोड
अपने प्रोजेक्ट की
CMakeLists.txt
फ़ाइल में,game-activity
को इंपोर्ट करें पैकेज तैयार करना है और उसे अपने टारगेट में जोड़ना है.game-activity
पैकेज के लिए ज़रूरी हैlibandroid.so
, इसलिए अगर यह मौजूद नहीं है, तो आपको इसे भी इंपोर्ट करना होगा.find_package(game-activity REQUIRED CONFIG) ... target_link_libraries(... android game-activity::game-activity)
एनडीके के
native_app_glue
कोड के सभी रेफ़रंस हटाएं, जैसे कि:${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c ... set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
अगर सोर्स कोड रिलीज़ का इस्तेमाल किया जा रहा है, तो
GameActivity
सोर्स को शामिल करें फ़ाइलें शामिल हैं. अगर आपको ऐसा नहीं करना है, तो यह चरण छोड़ दें.get_target_property(game-activity-include game-activity::game-activity INTERFACE_INCLUDE_DIRECTORIES) add_library(${PROJECT_NAME} SHARED main.cpp ${game-activity-include}/game-activity/native_app_glue/android_native_app_glue.c ${game-activity-include}/game-activity/GameActivity.cpp ${game-activity-include}/game-text-input/gametextinput.cpp)
UnsfiedLinkError की समस्या हल करें
अगर आपकोUnsatsifiedLinkError
com.google.androidgamesdk.GameActivity.initializeNativeCode()
फ़ंक्शन, जोड़ें
यह कोड आपकी CMakeLists.txt
फ़ाइल से लिंक किया गया:
set(CMAKE_SHARED_LINKER_FLAGS
"${CMAKE_SHARED_LINKER_FLAGS} -u \
Java_com_google_androidgamesdk_GameActivity_initializeNativeCode")
C/C++ सोर्स कोड के अपडेट
अपनेNativeActivity
GameActivity
वाला ऐप्लिकेशन:
GameActivity
के साथ रिलीज़ किए गएnative_app_glue
का इस्तेमाल करें. खोज औरandroid_native_app_glue.h
के सभी इस्तेमाल को इससे बदलें:#include <game-activity/native_app_glue/android_native_app_glue.h>
मोशन इवेंट फ़िल्टर और मुख्य इवेंट फ़िल्टर, दोनों को
NULL
पर सेट करें, ताकि आपका ऐप्लिकेशन ये काम कर सके सभी इनपुट डिवाइसों से इनपुट इवेंट पाएं. आप आमतौर पर इसे अंदर करते हैंandroid_main()
फ़ंक्शन:void android_main(android_app* app) { ... // other init code. android_app_set_key_event_filter(app, NULL); android_app_set_motion_event_filter(app, NULL); ... // additional init code, and game loop code. }
AInputEvent
मिलता-जुलता कोड हटाएं और उसे GameActivity के कोड से बदलेंInputBuffer
लागू करने की प्रक्रिया:while (true) { // Read all pending events. int events; struct android_poll_source* source; // If not animating, block forever waiting for events. // If animating, loop until all events are read, then continue // to draw the next frame of animation. while ((ALooper_pollAll(engine.animating ? 0 : -1, nullptr, &events, (void**)&source)) >= 0) { // Process this app cycle or inset change event. if (source) { source->process(source->app, source); } ... // Other processing. // Check if app is exiting. if (state->destroyRequested) { engine_term_display(&engine); return; } } // Process input events if there are any. engine_handle_input(state); if (engine.animating) { // Draw a game frame. } } // Implement input event handling function. static int32_t engine_handle_input(struct android_app* app) { auto* engine = (struct engine*)app->userData; auto ib = android_app_swap_input_buffers(app); if (ib && ib->motionEventsCount) { for (int i = 0; i < ib->motionEventsCount; i++) { auto *event = &ib->motionEvents[i]; int32_t ptrIdx = 0; switch (event->action & AMOTION_EVENT_ACTION_MASK) { case AMOTION_EVENT_ACTION_POINTER_DOWN: case AMOTION_EVENT_ACTION_POINTER_UP: // Retrieve the index for the starting and the ending of any secondary pointers ptrIdx = (event->action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; case AMOTION_EVENT_ACTION_DOWN: case AMOTION_EVENT_ACTION_UP: engine->state.x = GameActivityPointerAxes_getAxisValue( &event->pointers[ptrIdx], AMOTION_EVENT_AXIS_X); engine->state.y = GameActivityPointerAxes_getAxisValue( &event->pointers[ptrIdx], AMOTION_EVENT_AXIS_Y); break; case AMOTION_EVENT_ACTION_MOVE: // Process the move action: the new coordinates for all active touch pointers // are inside the event->pointers[]. Compare with our internally saved // coordinates to find out which pointers are actually moved. Note that there is // no index embedded inside event->action for AMOTION_EVENT_ACTION_MOVE (there // might be multiple pointers moved at the same time). ... break; } } android_app_clear_motion_events(ib); } // Process the KeyEvent in a similar way. ... return 0; }
NativeActivity से अटैच होने वाले लॉजिक की समीक्षा करें और उसे अपडेट करें
AInputEvent
. जैसा कि पिछले चरण में दिखाया गया है, GameActivity कीInputBuffer
प्रोसेसिंगALooper_pollAll()
लूप के बाहर है.android_app::activity->clazz
के इस्तेमाल को इससे बदलेंandroid_app:: activity->javaGameActivity
. GameActivity ने गेम में JavaGameActivity
इंस्टेंस.
अतिरिक्त चरण
पिछले चरणों में, NativeActivity के फ़ंक्शन के बारे में बताया गया है, लेकिन GameActivity
में
अतिरिक्त सुविधाएं जिनका आप शायद इस्तेमाल करना चाहें:
- Textइनपुट.
- गेम कंट्रोलर.
- फ़्रैगमेंट.
- नई विंडो InSets कमांड, जिनके बारे में NativeAppGlueAppCmd में बताया गया है.
हमारा सुझाव है कि आप इन सुविधाओं को एक्सप्लोर करें और इन्हें गेम.
अगर आपको GameActivity या अन्य एजीडीके के बारे में कोई सवाल पूछना है या सुझाव देना है तो हमें बताने के लिए गड़बड़ी तैयार करें.