Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Cocos2d-x

В этом руководстве показано, как включить AdMob с Firebase во вновь созданный проект Cocos2d-x. Если у вас еще нет проекта, вы можете продолжить, получив предварительные требования и создав новый проект cocos из командной строки:

cocos new MyGame -l cpp
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID ||
     CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  ...
#endif

Предпосылки

На вашем компьютере должно быть установлено следующее:

  • Последняя версия Cocos2d-x
  • Python 2.7 или выше
  • NDK r10d или выше (требуется только для разработки под Android)
  • CocoaPods 1.0.0 или выше (требуется только для разработки под iOS)

Получите AdMob с Firebase C ++ SDK

Загрузите SDK Firebase C ++ . Извлеките файлы в каталог верхнего уровня вашего проекта Cocos2d-x, в тот же каталог, который содержит proj.android-studio и proj.ios_mac . Назовите папку firebase_cpp_sdk .

Настроить iOS

Следующие шаги объясняют, как импортировать Firebase SDK во вновь созданный проект Cocos2d-x iOS.

  1. Следуйте инструкциям, чтобы добавить Firebase в свое приложение . После завершения ваш проект Xcode в proj.ios_mac/ должен ссылаться на GoogleService-Info.plist .

  2. Создайте Podfile в каталоге proj.ios_mac/ со следующим содержимым:

    source 'https://github.com/CocoaPods/Specs.git'
    
    platform :ios, '7.0'
    
    # Replace "MyGame" with the name of your game.
    target 'MyGame-mobile' do
      pod 'Firebase'
      pod 'Firebase/AdMob'
    end
    
  3. Запустите pod update чтобы установить CocoaPods, и откройте MyGame.xcworkspace в соответствии с инструкциями CocoaPods. На данный момент у вас есть SDK Firebase и AdMob для iOS, включенные в ваш проект.

  4. CocoaPods выдает предупреждения об отсутствии $(inherited) в некоторых свойствах. Перейдите к настройкам сборки для MyGame-mobile target в Xcode и добавьте $(inherited) в конец списка для каждой из следующих настроек сборки:

    • Другие флаги компоновщика
    • Макросы препроцессора
    • Пути поиска библиотеки
  5. Пока вы находитесь в настройках сборки, добавьте $(PROJECT_DIR)/../firebase_cpp_sdk/frameworks/ios/universal к вашим путям поиска Framework и $(PROJECT_DIR)/../firebase_cpp_sdk/include к вашим путям поиска заголовков .

  6. Затем вам нужно включить ссылку на библиотеки, которые вы хотите использовать. Щелкните правой кнопкой мыши свой проект и выберите Добавить файлы в «MyGame» . В каталоге firebase_cpp_sdk/frameworks/ios/universal выберите firebase.framework и firebase_admob.framework . Перед добавлением фреймворков снимите флажок Копировать элементы при необходимости . Настройки сборки, которые вы добавили на предыдущем шаге, позволяют Xcode знать, где найти фреймворки.

  7. Добавьте GameController.framework к GameController.framework сборки> Свяжите двоичный GameController.framework с библиотеками .

  8. Следуйте руководству AdMob по безопасности транспорта приложений, чтобы убедиться, что все объявления корректно работают на iOS 9 и более поздних версиях.

Контрольная точка: у вас должна быть возможность создавать и запускать приложение iOS из Xcode.

Теперь ваш проект iOS настроен с интегрированными AdMob и Firebase. Вы готовы к настройке Android-проекта.

Настроить Android

Следующие шаги объясняют, как импортировать Firebase SDK во вновь созданный проект Cocos2d-x Android.

  1. Откройте свой proj.android-studio/app/jni/Android.mk и добавьте строки, выделенные жирным шрифтом ниже. Убедитесь, что в FIREBASE_CPP_SDK_DIR установлен локальный путь к только что загруженному SDK Firebase C ++.

    LOCAL_PATH := $(call my-dir)
     
    # The path to the Firebase C++ SDK, in the project's root directory.
    FIREBASE_CPP_SDK_DIR := ../../../firebase_cpp_sdk
     
    APP_ABI := armeabi-v7a x86
    STL := $(firstword $(subst _, ,$(APP_STL)))
    FIREBASE_LIBRARY_PATH := $(FIREBASE_CPP_SDK_DIR)/libs/android/$(TARGET_ARCH_ABI)/$(STL)
     
    include $(CLEAR_VARS)
    LOCAL_MODULE := firebase_app
    LOCAL_SRC_FILES := $(FIREBASE_LIBRARY_PATH)/libapp.a
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(FIREBASE_CPP_SDK_DIR)/include
    include $(PREBUILT_STATIC_LIBRARY)
     
    include $(CLEAR_VARS)
    LOCAL_MODULE := firebase_feature
    LOCAL_SRC_FILES := $(FIREBASE_LIBRARY_PATH)/libadmob.a
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(FIREBASE_CPP_SDK_DIR)/include
    include $(PREBUILT_STATIC_LIBRARY)
     
    include $(CLEAR_VARS)
     
    $(call import-add-path,$(LOCAL_PATH)/../../../cocos2d)
    $(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/external)
    $(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/cocos)
    $(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/cocos/audio/include)
     
    LOCAL_MODULE := MyGame_shared
    LOCAL_MODULE_FILENAME := libMyGame
     
    LOCAL_SRC_FILES := hellocpp/main.cpp \
                       ../../../Classes/AppDelegate.cpp \
                       ../../../Classes/HelloWorldScene.cpp
     
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes
     
    # _COCOS_HEADER_ANDROID_BEGIN
    # _COCOS_HEADER_ANDROID_END
     
    LOCAL_STATIC_LIBRARIES := cocos2dx_static
    LOCAL_STATIC_LIBRARIES += firebase_app
    LOCAL_STATIC_LIBRARIES += firebase_feature
     
    # _COCOS_LIB_ANDROID_BEGIN
    # _COCOS_LIB_ANDROID_END
     
    include $(BUILD_SHARED_LIBRARY)
     
    $(call import-module,.)
     
    # _COCOS_LIB_IMPORT_ANDROID_BEGIN
    # _COCOS_LIB_IMPORT_ANDROID_END
    
  2. Убедитесь, что вы все еще можете скомпилировать приложение Cocos:

    cocos compile -p android --ap android-24 --android-studio --app-abi armeabi-v7a
    
  3. Следуйте proj.android-studio/ по добавлению Firebase в свое приложение , которое находится в proj.android-studio/ .

  4. Включите рекламный пакет в свой app/build.gradle :

    implementation 'com.google.firebase:firebase-ads:19.4.0'
    
  5. Убедитесь, что вы все еще можете скомпилировать приложение Cocos:

    cocos compile -p android --ap android-42 --android-studio --app-abi armeabi-v7a
    

Ваш проект Android теперь ссылается на компоненты AdMob в Firebase C ++ SDK.

Интеграция с C ++

Теперь, когда на ваши проекты iOS и Android есть ссылки в Firebase C ++ SDK, следующим шагом будет использование SDK и загрузка рекламы.

Инициализировать Firebase и AdMob

Рекомендуется инициализировать Firebase и AdMob как можно раньше в жизненном цикле приложения. Наиболее естественное место для добавления этого кода инициализации для проекта Cocos2d-x - это файл AppDelegate.cpp :

AppDelegate.cpp


#include "firebase/app.h"
#include "firebase/admob.h"

USING_NS_CC;

bool AppDelegate::applicationDidFinishLaunching() {

  ...

  #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
  // Initialize Firebase for Android.
  firebase::App* app = firebase::App::Create(
  firebase::AppOptions(), JniHelper::getEnv(), JniHelper::getActivity());
  // Initialize AdMob.
  firebase::admob::Initialize(*app, "INSERT_YOUR_ADMOB_ANDROID_APP_ID");
  #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  // Initialize Firebase for iOS.
  firebase::App* app = firebase::App::Create(firebase::AppOptions());
  // Initialize AdMob.
  firebase::admob::Initialize(*app, "INSERT_YOUR_ADMOB_IOS_APP_ID");
  #endif
  // Initialize AdMob.
  firebase::admob::Initialize(*app);
  // Create a scene. it's an autorelease object.
  auto scene = HelloWorldScene::createScene();
  // run
  director->runWithScene(scene);
  return true;
}

На Android для создания приложения Firebase требуется среда JNI и Activity. В приведенном выше примере кода для предоставления этих параметров используется класс JniHelper из Cocos2d-x.

Получите рекламного родителя

AdMob требует объекта firebase::admob::AdParent для инициализации каждого формата рекламы. Этот объект соответствует Activity на Android и UIView на iOS. Следующий вспомогательный класс создает единственный getAdParent() который возвращает соответствующий объект в зависимости от платформы.

FirebaseHelper.h

#ifndef __FIREBASE_HELPER_H__
#define __FIREBASE_HELPER_H__

#include "firebase/admob/types.h"

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
extern "C" {
#include <objc/objc.h>
}  // extern "C"
#endif

// Returns a variable that describes the ad parent for the app. On Android
// this will be a JObject pointing to the Activity. On iOS, it's an ID pointing
// to the root view of the view controller.
firebase::admob::AdParent getAdParent();

#endif // __FIREBASE_HELPER_H__

FirebaseHelper.cpp

#include "FirebaseHelper.h"

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#endif

USING_NS_CC;

firebase::admob::AdParent getAdParent() {
  #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  // Returns the iOS RootViewController's main view (i.e. the EAGLView).
  return (id)Director::getInstance()->getOpenGLView()->getEAGLView();
  #elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
  // Returns the Android Activity.
  return JniHelper::getActivity();
  #else
  // A void* for any other environments.
  return 0;
  #endif
}

Добавьте этот класс FirebaseHelper в папку Classes/ вашего проекта. Обязательно добавьте этот файл в свой проект Xcode для iOS и обновите локальные исходные файлы в вашем Android.mk для Android:

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../../Classes/AppDelegate.cpp \
                   ../../../Classes/HelloWorldScene.cpp \
                   ../../../Classes/FirebaseHelper.cpp

Загрузите рекламный баннер

Полный пример того, как загрузить рекламный баннер, показан ниже с использованием getAdParent() определенного выше.

#include "FirebaseHelper.h"

#include "firebase/admob.h"
#include "firebase/admob/types.h"
#include "firebase/app.h"
#include "firebase/future.h"
#include "firebase/admob/banner_view.h"

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <android/log.h>
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#endif

USING_NS_CC;

bool HelloWorld::init()
{
  // General scene setup ...

  #if defined(__ANDROID__)
  // Android ad unit IDs.
  const char* kBannerAdUnit = "ca-app-pub-3940256099942544/6300978111";
  #else
  // iOS ad unit IDs.
  const char* kBannerAdUnit = "ca-app-pub-3940256099942544/2934735716";
  #endif

  // Create and initialize banner view.
  firebase::admob::BannerView* banner_view;
  banner_view = new firebase::admob::BannerView();
  firebase::admob::AdSize ad_size;
  ad_size.ad_size_type = firebase::admob::kAdSizeStandard;
  ad_size.width = 320;
  ad_size.height = 50;
  banner_view->Initialize(getAdParent(), kBannerAdUnit, ad_size);

  // Schedule updates so that the Cocos2d-x update() method gets called.
  this->scheduleUpdate();
  return true;
}

void HelloWorld::update(float delta) {
  // Check that the banner has been initialized.
  if (banner_view->InitializeLastResult().status() ==
      firebase::kFutureStatusComplete) {
    // Check that the banner hasn't started loading.
    if (banner_view->LoadAdLastResult().status() ==
        firebase::kFutureStatusInvalid) {
      // Make the banner visible and load an ad.
      CCLOG("Loading a banner.");
      banner_view->Show();
      firebase::admob::AdRequest my_ad_request = {};
      banner_view->LoadAd(my_ad_request);
    }
  }
}

Что дальше

Теперь, когда у вас есть Firebase с AdMob SDK, интегрированный в ваш проект Cocos2d-x, вы можете взаимодействовать с Google Mobile Ads SDK и реализовать предпочтительный формат: