NativeActivity থেকে মাইগ্রেট করুন Android Game Development Kit-এর অংশ।
এই পৃষ্ঠায় আপনার Android গেম প্রোজেক্টে
NativeActivity থেকে
GameActivity-এ কীভাবে মাইগ্রেট করবেন তা বর্ণনা করা হয়েছে।
GameActivity, Android ফ্রেমওয়ার্কের NativeActivity-এর উপর ভিত্তি করে তৈরি,
এতে উন্নত ও নতুন ফিচার রয়েছে:
- Jetpack থেকে
Fragment-এ কাজ করে। - সফ্ট কীবোর্ড ইন্টিগ্রেশন সহজ করতে
TextInputসহায়তা যোগ করে। NativeActivityonInputEventইন্টারফেসের পরিবর্তেGameActivityজাভা ক্লাসে টাচ ও কী ইভেন্ট ম্যানেজ করে।
মাইগ্রেট করার আগে, আমরা আপনাকে
শুরু করার নির্দেশিকা পড়ে নিতে সাজেস্ট করি, যেখানে আপনার প্রোজেক্টে কীভাবে
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লাইব্রেরি যোগ করুন।- আপনার বর্তমান ন্যূনতম API লেভেল ১৬-এর কম হলে, এটি আপডেট করে কমপক্ষে ১৬ করুন।
- কম্পাইল করা 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") } } }
জাভা
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>ফুল স্ক্রিন মোডের জন্য বিস্তারিত নির্দেশাবলী পেতে, ইমার্সিভ গাইড এবং games-samples রেপো-তে উদাহরণ প্রয়োগ দেখুন।
এই মাইগ্রেশন গাইড নেটিভ লাইব্রেরির নাম পরিবর্তন করে না। আপনি যদি এটি পরিবর্তন করেন, তাহলে নিশ্চিত করুন যে নেটিভ লাইব্রেরির নাম নিম্নলিখিত তিনটি লোকেশনে একই আছে:
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
ইউটিলিটি সহ AAR-এর মধ্যে রিলিজ প্যাক করা আছে। নেটিভ কোডে GameActivity-এর 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)
UnsatisfiedLinkError সংক্রান্ত সমস্যার সমাধান করা
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++ সোর্স কোড আপডেট
আপনার অ্যাপ্লিকেশনে 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_pollOnce(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_pollOnce()লুপের বাইরে হয়।android_app::activity->clazz-এর ব্যবহারandroid_app:: activity->javaGameActivityদিয়ে পরিবর্তন করুন। GameActivity, JavaGameActivityইনস্ট্যান্সের নাম পরিবর্তন করে।
অতিরিক্ত ধাপ
আগের ধাপগুলিতে NativeActivity-এর কার্যকারিতা কভার করা হয়েছে, তবে GameActivity-এ
অতিরিক্ত ফিচার রয়েছে যা আপনি ব্যবহার করতে চাইতে পারেন:
- TextInput.
- গেম কন্ট্রোলার।
- ফ্র্যাগমেন্ট।
- NativeAppGlueAppCmd-এ নতুন উইন্ডো InSets কমান্ড সংজ্ঞায়িত করা হয়েছে।
আমরা সাজেস্ট করি যে আপনি এইসব ফিচার এক্সপ্লোর করুন এবং আপনার গেমের জন্য উপযুক্ত হলে সেগুলি গ্রহণ করুন।
GameActivity বা অন্যান্য AGDK লাইব্রেরি সম্পর্কে আপনার কোনও প্রশ্ন বা সাজেশন থাকলে, একটি বাগ তৈরি করে আমাদের জানান।