Я занимаюсь разработкой мобильной игры с использованием движка Cocos2D-x для платформы Android и хочу интегрировать в нее GPGS.
Мне удалось показать списки лидеров, но есть небольшая досадная проблема. Когда отображается таблица лидеров, если я захожу в фон, а затем возвращаюсь в приложение, игровая сцена становится черной. Я думаю, что контекст opengl выпущен и не восстанавливается снова. По моему мнению, это приводит к тому, что при запуске таблицы лидеров на одной и той же активности движок игры не может понять, что там происходит. Как бы то ни было, из-за этого я хочу запустить таблицу лидеров (а также все вещи GPGS) в новом действии, используя намерение.
Google любит «Предоставление»
В справочных документах Google Play Game Services C ++ SDK есть несколько неясных / нечетких объяснений использования метода SetOptionalIntentHandlerForUI.«Предоставить функцию, которая может запустить предоставленное намерение пользовательского интерфейса в любой точке, используя startActivityForResult».
Что означает «Предоставление»? Что такое заданное намерение? Как я буду использовать метод startActivityForResult? К сожалению, «использование» и «предоставление методов» не являются четкими выражениями для кодирования. Там нет образца о
используя этот метод в документах GPGS для C ++. В конце концов,
Документ Google настолько беден и
в интернете нет полезной информации. Если кто-то из Google поможет мне, я буду так счастлив.
Как я понимаю, я написал такой код. Но выдает ошибку при запуске.
AppActivity.java
public void runGPGSActivity(Intent i) {
startActivityForResult(i,100);
}
AndroidPlatformConfiguration.h (из C ++ gpg lib)
typedef std::function<void(jobject)> IntentHandler;
AndroidPlatformConfiguration &SetOptionalIntentHandlerForUI(
IntentHandler intent_handler);
main.cpp (JNI-привязка, рабочий код, GPGS работает на той же активности)
gpg::AndroidPlatformConfiguration platform_configuration;
platform_configuration.SetActivity(activity);
StateManager::InitServices( ...
main.cpp (JNI-привязка, GPGS должен быть запущен при новой активности)
gpg::AndroidPlatformConfiguration platform_configuration;
jclass activityClass = env->FindClass("org/cocos2dx/cpp/AppActivity");
jmethodID jIntentHandlerMethodID = env->GetMethodID(activityClass,"runGPGSActivity","(Landorid/content/Intent;)V");
jobject jIntentHandler = env->NewObject(activityClass, jIntentHandlerMethodID);
gpg::AndroidPlatformConfiguration::IntentHandler mIntentHandler; /*= [](jobject mjIntentHandler){};*/
std::function<void(jobject)> intentHandler = std::bind(mIntentHandler,jIntentHandler);
platform_configuration.SetOptionalIntentHandlerForUI(intentHandler);
platform_configuration.SetActivity(activity);
StateManager::InitServices(
Нет ошибки сборки, но приложение вылетает при запуске.
03-24 14: 12: 24.301: A / libc (21352): фатальный сигнал 6 (SIGABRT) при
0x00005368 (код = -6), резьба 21352 (основная)
И некоторые ссылки на эту проблему:
/// Заранее спасибо. ///
…Да, я решил проблему, но не использовал метод IntentHandler.
Я использовал этот код в своем приложении, чтобы показать еженедельные данные списка лидеров.
gameServices->Leaderboards().ShowUIBlocking(leaderboardId,gpg::LeaderboardTimeSpan::WEEKLY);
Но возвращаемое значение не является недействительным, это UIStatus (что бы это ни было)
Я вернулся к этому коду, приложение не переходит на черный экран. Этот метод возвращает void, я думаю, что мне нужно перехватить некоторые обратные вызовы при использовании метода ShowUIBlocking с этим UIStatus.
gameServices->Leaderboards().ShowUI(leaderboardId);
Но сейчас я не могу извлечь выгоду из функции временной шкалы лидеров.
Я собираюсь исследовать, как это может быть использовано. На данный момент проблем нет. Но документация SetOptionalIntentHandlerForUI должна быть написана более явно для программистов, которые хотят ее использовать.
Других решений пока нет …