NativeActivity'den geçiş yapın Android Game Development Kit'in bir parçasıdır.
Bu sayfada, Android oyun projenizde NativeActivity
'ten GameActivity
'e nasıl geçiş yapacağınız açıklanmaktadır.
GameActivity
, Android çerçevesindeki NativeActivity
uygulamasını temel alır ve geliştirmeler ile yeni özellikler içerir:
- Jetpack'ten
Fragment
destekler. - Yumuşak klavye entegrasyonunu kolaylaştırmak için
TextInput
desteği ekler. - Dokunma ve önemli etkinlikleri
NativeActivity
onInputEvent
arayüzü yerineGameActivity
Java sınıfında işler.
Taşıma işleminden önce, GameActivity
kurulumunun nasıl yapılacağını ve projenize entegre edeceğinizi açıklayan başlangıç kılavuzunu okumanızı öneririz.
Java derleme komut dosyası güncellemeleri
GameActivity
, Jetpack kitaplığı olarak dağıtılır. Başlangıç kılavuzunda açıklanan Gradle komut dosyası güncelleme adımlarını uyguladığınızdan emin olun:
Projenizin
gradle.properties
dosyasında Jetpack kitaplığını etkinleştirin:android.useAndroidX=true
İsteğe bağlı olarak, aynı
gradle.properties
dosyasında bir Prefab sürümü belirtin. Örneğin:android.prefabVersion=2.0.0
Uygulamanızın
build.gradle
dosyasında Prefab özelliğini etkinleştirin:android { ... // other configurations buildFeatures.prefab true }
GameActivity
bağımlılığını uygulamanıza ekleyin:core
vegames-activity
kitaplıklarını ekleyin.- Şu anda desteklenen minimum API düzeyiniz 16'dan azsa bunu en az 16 olarak güncelleyin.
- Derlenen SDK sürümünü
games-activity
kitaplığının gerektirdiği sürüme güncelleyin. Jetpack, genellikle yayın derleme zamanında en son SDK sürümünü gerektirir.
Güncellenen
build.gradle
dosyanız aşağıdaki gibi görünebilir: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 veya Java kod güncellemeleri
NativeActivity
bir başlangıç etkinliği olarak kullanılabilir ve tam ekran uygulama oluşturur. Şu anda GameActivity başlangıç etkinliği olarak kullanılamaz. Uygulamalar, GameActivity
parametresinden bir sınıf türetmeli ve bunu başlangıç etkinliği olarak kullanmalıdır. Tam ekran uygulama oluşturmak için ek yapılandırma
değişiklikleri de yapmanız gerekir.
Aşağıdaki adımlarda, uygulamanızın başlatma etkinliği olarak NativeActivity
kullandığı varsayılır. Böyle bir durum söz konusu değilse çoğunu atlayabilirsiniz.
Yeni başlangıç etkinliğini barındırmak için bir Kotlin veya Java dosyası oluşturun. Örneğin, aşağıdaki kod başlangıç etkinliği olarak
MainActivity
öğesini oluşturur ve uygulamanın ana yerel kitaplığını (libAndroidGame.so
) yükler: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
dosyasında tam ekran uygulama teması oluşturun:<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
dosyasındaki temayı uygulamaya uygulayın:<application android:theme=”@style/Application.Fullscreen”> <!-- other configurations not listed here. --> </application>
Tam ekran moduyla ilgili ayrıntılı talimatlar için kapsamlı kılavuza ve oyun-örnekleri deposundaki örnek uygulamaya göz atın.
Bu taşıma rehberi, yerel kitaplık adını değiştirmez. Kodu değiştirirseniz yerel kitaplık adlarının aşağıdaki üç konumda tutarlı olduğundan emin olun:
Kotlin veya Java kodu:
System.loadLibrary(“AndroidGame”)
AndroidManifest.xml
:<meta-data android:name="android.app.lib_name" android:value="AndroidGame" />
C/C++ derleme komut dosyası içinde, örneğin
CMakeLists.txt
:add_library(AndroidGame ...)
C/C++ derleme komut dosyası güncellemeleri
Bu bölümdeki talimatlarda örnek olarak cmake
kullanılmıştır. Uygulamanız ndk-build
kullanıyorsa bunları ndk-build dokümantasyon sayfasında açıklanan eşdeğer komutlarla eşlemeniz gerekir.
GameActivity'nin C/C++ uygulaması, bir kaynak kodu sürümü sağlıyor. 1.2.2 ve üzeri sürümler için statik bir kitaplık sürümü sağlanır. Statik kitaplık, önerilen sürüm türüdür.
Sürüm, prefab
yardımcı programıyla birlikte AAR'nin içinde yer alır. Yerel kod, GameActivity’nin C/C++ kaynaklarını ve native_app_glue
kodunu içerir. Bunların, uygulamanızın C/C++ koduyla birlikte derlenmesi gerekir.
NativeActivity
uygulamalarda, NDK içinde gönderilen native_app_glue
kodu zaten kullanılıyor. Bu değeri GameActivity'nin native_app_glue
sürümüyle değiştirmeniz gerekiyor. Bunun dışında, başlangıç kılavuzunda belirtilen cmake
adımların tümü geçerlidir:
Projenize aşağıdaki gibi C/C++ statik kitaplığını veya C/++ kaynak kodunu içe aktarın.
Statik kitaplık
Projenizin
CMakeLists.txt
dosyasındakigame-activity
statik kitaplığınıgame-activity_static
prefab modülüne aktarın:find_package(game-activity REQUIRED CONFIG) target_link_libraries(${PROJECT_NAME} PUBLIC log android game-activity::game-activity_static)
Kaynak kodu
Projenizin
CMakeLists.txt
dosyasınagame-activity
paketini içe aktarın ve hedefinize ekleyin.game-activity
paketi içinlibandroid.so
gerekir. Bu nedenle, eksikse paketi içe aktarmanız gerekir.find_package(game-activity REQUIRED CONFIG) ... target_link_libraries(... android game-activity::game-activity)
NDK'nın
native_app_glue
koduna ilişkin tüm referansları kaldırın. Örneğin:${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c ... set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
Kaynak kodu sürümünü kullanıyorsanız
GameActivity
kaynak dosyalarını dahil edin. Aksi takdirde bu adımı atlayın.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 sorununu çözme
com.google.androidgamesdk.GameActivity.initializeNativeCode()
işlevi için bir UnsatsifiedLinkError
ile karşılaşırsanız şu kodu CMakeLists.txt
dosyanıza ekleyin:
set(CMAKE_SHARED_LINKER_FLAGS
"${CMAKE_SHARED_LINKER_FLAGS} -u \
Java_com_google_androidgamesdk_GameActivity_initializeNativeCode")
C/C++ kaynak kodu güncellemeleri
Uygulamanızdaki NativeActivity
referansını GameActivity
ile değiştirmek için şu adımları izleyin:
GameActivity
ile yayınlanannative_app_glue
öğesini kullanın. Tümandroid_native_app_glue.h
kullanımını arayıp şununla değiştirin:#include <game-activity/native_app_glue/android_native_app_glue.h>
Uygulamanızın tüm giriş cihazlarından giriş etkinliklerini alabilmesi için hem hareket etkinliği filtresini hem de önemli etkinlik filtresini
NULL
olarak ayarlayın. Bunu genellikleandroid_main()
işlevinin içinde yaparsınız: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. }
İlgili
AInputEvent
kodu kaldırın ve GameActivity'ninInputBuffer
uygulamasıyla değiştirin: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'nin
AInputEvent
öğesine ekli mantığı inceleyin ve güncelleyin. Önceki adımda gösterildiği gibi, GameActivity'ninInputBuffer
işlemesiALooper_pollAll()
döngüsünün dışındadır.android_app::activity->clazz
kullanımınıandroid_app:: activity->javaGameActivity
ile değiştirin. GameActivity, JavaGameActivity
örneğini yeniden adlandırıyor.
Ek adımlar
Önceki adımlar NativeActivity'nin işlevselliğini kapsamaktadır ancak GameActivity
ürününün kullanmak isteyebileceğiniz ek özellikleri vardır:
- TextInput.
- Oyun Denetleyici.
- Parça.
- NativeAppGlueAppCmd içinde tanımlanan yeni pencere InSets komutları.
Bu özellikleri keşfetmenizi ve oyunlarınızda uygun şekilde kullanmanızı öneririz.
GameActivity veya diğer AGDK kitaplıklarıyla ilgili sorularınız ya da önerileriniz varsa hata oluşturarak bize bildirin.