Android গেম ডেভেলপমেন্ট কিটের NativeActivity অংশ থেকে মাইগ্রেট করুন।
এই পৃষ্ঠাটি আপনার Android গেম প্রকল্পে NativeActivity
থেকে GameActivity
এ কীভাবে স্থানান্তরিত করবেন তা বর্ণনা করে।
GameActivity
অ্যান্ড্রয়েড ফ্রেমওয়ার্কের NativeActivity
উপর ভিত্তি করে, উন্নত এবং নতুন বৈশিষ্ট্য সহ:
- জেটপ্যাক থেকে
Fragment
সমর্থন করে। - নরম কীবোর্ড একীকরণের সুবিধার্থে
TextInput
সমর্থন যোগ করে। -
NativeActivity
onInputEvent
ইন্টারফেসের পরিবর্তেGameActivity
Java ক্লাসে স্পর্শ এবং মূল ইভেন্টগুলি পরিচালনা করে।
স্থানান্তর করার আগে, আমরা শুরু করার নির্দেশিকাটি পড়ার পরামর্শ দিই, যা বর্ণনা করে কিভাবে আপনার প্রকল্পে GameActivity
সেট আপ এবং সংহত করতে হয়।
জাভা বিল্ড স্ক্রিপ্ট আপডেট
GameActivity
একটি জেটপ্যাক লাইব্রেরি হিসাবে বিতরণ করা হয়। শুরু করার নির্দেশিকাতে বর্ণিত গ্রেডল স্ক্রিপ্ট আপডেট করার পদক্ষেপগুলি প্রয়োগ করা নিশ্চিত করুন:
আপনার প্রকল্পের
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
লাইব্রেরি যোগ করুন। - আপনার বর্তমান ন্যূনতম সমর্থিত API স্তর 16-এর কম হলে, এটি কমপক্ষে 16-এ আপডেট করুন।
-
games-activity
লাইব্রেরির প্রয়োজনে সংকলিত SDK সংস্করণটি আপডেট করুন। জেটপ্যাকের জন্য সাধারণত রিলিজ তৈরির সময়ে সর্বশেষ 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' }
-
কোটলিন বা জাভা কোড আপডেট
NativeActivity
একটি স্টার্টআপ কার্যকলাপ হিসাবে ব্যবহার করা যেতে পারে এবং একটি পূর্ণ স্ক্রীন অ্যাপ্লিকেশন তৈরি করে। বর্তমানে, GameActivity প্রারম্ভিক কার্যকলাপ হিসাবে ব্যবহার করা যাবে না . অ্যাপগুলিকে অবশ্যই GameActivity
থেকে একটি ক্লাস নিতে হবে এবং সেটিকে স্টার্টআপ অ্যাক্টিভিটি হিসেবে ব্যবহার করতে হবে। একটি পূর্ণ স্ক্রীন অ্যাপ তৈরি করতে আপনাকে অবশ্যই অতিরিক্ত কনফিগারেশন পরিবর্তন করতে হবে।
নিম্নলিখিত পদক্ষেপগুলি অনুমান করে যে আপনার অ্যাপ্লিকেশনটি স্টার্টআপ কার্যকলাপ হিসাবে NativeActivity
ব্যবহার করে৷ যদি তা না হয়, আপনি তাদের বেশিরভাগ এড়িয়ে যেতে পারেন।
নতুন স্টার্টআপ কার্যকলাপ হোস্ট করতে একটি Kotlin বা Java ফাইল তৈরি করুন। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি স্টার্টআপ কার্যকলাপ হিসাবে
MainActivity
তৈরি করে এবং অ্যাপ্লিকেশনটির প্রধান নেটিভ লাইব্রেরি,libAndroidGame.so
লোড করে:কোটলিন
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") } } }
জাভা
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>
পূর্ণ স্ক্রীন মোডের জন্য বিস্তারিত নির্দেশাবলীর জন্য, গেমস-নমুনা রেপোতে নিমজ্জিত গাইড এবং উদাহরণ বাস্তবায়ন দেখুন।
এই মাইগ্রেশন গাইড নেটিভ লাইব্রেরির নাম পরিবর্তন করে না। আপনি যদি এটি পরিবর্তন করেন তবে নিশ্চিত করুন যে নেটিভ লাইব্রেরির নামগুলি নিম্নলিখিত তিনটি অবস্থানে সামঞ্জস্যপূর্ণ:
কোটলিন বা জাভা কোড:
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 ডকুমেন্টেশন পৃষ্ঠায় বর্ণিত সমতুল্য কমান্ডগুলিতে ম্যাপ করতে হবে।
গেমঅ্যাক্টিভিটির C/C++ বাস্তবায়ন সোর্স কোড রিলিজ প্রদান করছে। পরবর্তী সংস্করণ 1.2.2 এর জন্য, একটি স্ট্যাটিক লাইব্রেরি রিলিজ প্রদান করা হয়। স্ট্যাটিক লাইব্রেরি হল প্রস্তাবিত প্রকাশের ধরন।
রিলিজটি prefab
ইউটিলিটি সহ AAR এর ভিতরে প্যাক করা হয়। নেটিভ কোডটিতে গেমঅ্যাক্টিভিটির C/C++ উত্স এবং native_app_glue
কোড অন্তর্ভুক্ত রয়েছে। এগুলিকে আপনার অ্যাপ্লিকেশনের C/C++ কোডের সাথে একসাথে তৈরি করতে হবে।
NativeActivity
অ্যাপ্লিকেশানগুলি ইতিমধ্যে NDK-এর ভিতরে পাঠানো native_app_glue
কোড ব্যবহার করে৷ আপনাকে অবশ্যই এটিকে 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)
NDK এর
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)
অসন্তুষ্ট লিঙ্ক ত্রুটির সমস্যা নিয়ে কাজ করুন
আপনি যদি com.google.androidgamesdk.GameActivity.initializeNativeCode()
ফাংশনের জন্য একটি UnsatsifiedLinkError
সম্মুখীন হন, তাহলে এই কোডটি আপনার CMakeLists.txt
ফাইলে যোগ করুন:
set(CMAKE_SHARED_LINKER_FLAGS
"${CMAKE_SHARED_LINKER_FLAGS} -u \
Java_com_google_androidgamesdk_GameActivity_initializeNativeCode")
C/C++ সোর্স কোড আপডেট
GameActivity
সাথে আপনার অ্যাপ্লিকেশনে NativeActivity
রেফারেন্স প্রতিস্থাপন করতে এই পদক্ষেপগুলি অনুসরণ করুন:
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
উদাহরণের নাম পরিবর্তন করে।
অতিরিক্ত পদক্ষেপ
পূর্ববর্তী পদক্ষেপগুলি নেটিভ অ্যাক্টিভিটির কার্যকারিতা কভার করে, তবে GameActivity
অতিরিক্ত বৈশিষ্ট্য রয়েছে যা আপনি ব্যবহার করতে চাইতে পারেন:
- টেক্সটইনপুট ।
- গেম কন্ট্রোলার ।
- খণ্ড ।
- NativeAppGlueAppCmd- এ সংজ্ঞায়িত নতুন উইন্ডো InSets কমান্ড।
আমরা এই বৈশিষ্ট্যগুলি অন্বেষণ করার এবং আপনার গেমগুলির জন্য উপযুক্ত হিসাবে সেগুলি গ্রহণ করার পরামর্শ দিই৷
গেমঅ্যাক্টিভিটি বা অন্যান্য AGDK লাইব্রেরির জন্য আপনার কোনো প্রশ্ন বা সুপারিশ থাকলে, আমাদের জানাতে একটি বাগ তৈরি করুন।