Cocos2d-x

Este guia demonstra como incluir a AdMob com o Firebase em um projeto Cocos2d-x recém-criado. Se você ainda não tem um projeto, pode acompanhar conseguindo os pré-requisitos e criando um novo projeto cocos na linha de comando:

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

Pré-requisitos

Você precisa ter instalado o seguinte em sua máquina:

  • a última versão do Cocos2d-x
  • Python 2.7 ou posterior
  • NDK r10d ou posterior (apenas necessário para desenvolvimento em Android)
  • CocoaPods 1.0.0 ou posterior (apenas necessário para desenvolvimento em iOS)

Fazer download da AdMob com o SDK do Firebase para C++

Faça o download do SDK do Firebase para C++. Extraia os arquivos no diretório de nível superior do projeto Cocos2d-x, o mesmo diretório que contém os diretórios proj.android-studio e proj.ios_mac. Dê um nome à pasta firebase_cpp_sdk.

Configurar iOS

As etapas a seguir explicam como importar o SDK do Firebase para um projeto Cocos2d-x iOS recém-criado.

  1. Siga as etapas para adicionar o Firebase ao seu app. Depois de concluído, seu projeto Xcode dentro do diretório proj.ios_mac/ deve fazer referência a um arquivo GoogleService-Info.plist.

  2. Crie um Podfile no diretório proj.ios_mac/ com o seguinte conteúdo:

    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. Execute pod update para instalar o CocoaPods e abra o MyGame.xcworkspace conforme instruído pelo CocoaPods. Neste momento, você tem o SDK do Firebase para iOS e o SDK dos anúncios para dispositivos móveis do Google incluídos no projeto.

  4. O CocoaPods fornece avisos sobre $(inherited) ausente em algumas propriedades. Vá para as configurações de compilação do destino MyGame-mobile no Xcode e adicione $(inherited) ao final da lista para cada uma das seguintes configurações de compilação:

    • Outras sinalizações de vinculador
    • macros de pré-processador
    • Caminhos de pesquisa de biblioteca
  5. Enquanto estiver nas configurações de compilação, adicione $(PROJECT_DIR)/../firebase_cpp_sdk/frameworks/ios/universal aos Caminhos de pesquisa do framework e $(PROJECT_DIR)/../firebase_cpp_sdk/include aos Caminhos de pesquisa de cabeçalho.

  6. Em seguida, você precisa incluir uma referência às bibliotecas que quer usar. Clique com o botão direito do mouse no projeto e selecione Adicionar arquivos a "MyGame". No diretório firebase_cpp_sdk/frameworks/ios/universal, selecione firebase.framework e firebase_admob.framework. Antes de adicionar os frameworks, desmarque a opção Copiar itens se necessário. As configurações de compilação que você adicionou na etapa anterior permitem que o Xcode saiba onde encontrar as estruturas.

  7. Adicione GameController.framework a Fases de compilação > Vincular binário com bibliotecas.

  8. Siga o guia Segurança do transporte de apps da AdMob para garantir que todos os anúncios se comportem corretamente no iOS 9 e acima.

Checkpoint: é possível criar e executar o app iOS com base no Xcode.

Você configurou seu projeto para iOS com a AdMob e o Firebase integrados. Você está pronto para configurar o projeto do Android.

Configurar o Android

As etapas a seguir explicam como importar o SDK do Firebase para um projeto Cocos2d-x do Android recém-criado.

  1. Abra seu proj.android-studio/app/jni/Android.mk e adicione as linhas exibidas em negrito abaixo. Certifique-se de configurar FIREBASE_CPP_SDK_DIR como o caminho local para o SDK do Firebase para C++ que você acabou de transferir por download.

    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. Verifique se você ainda pode compilar o app Cocos:

    cocos compile -p android --ap android-24 --android-studio --app-abi armeabi-v7a
    
  3. Siga as etapas para adicionar o Firebase ao seu app localizado no diretório proj.android-studio/.

  4. Inclua o pacote de anúncios no seu app/build.gradle:

    implementation 'com.google.firebase:firebase-ads:21.0.0'
    
  5. Verifique se você ainda pode compilar o app Cocos:

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

Seu projeto do Android agora faz referência aos componentes da AdMob no SDK do Firebase para C++.

Integração do C++

Agora que os projetos de iOS e Android são referenciados no SDK do Firebase para C++, o próximo passo é começar a usar o SDK e carregar alguns anúncios.

Inicializar o Firebase e a AdMob

Recomenda-se inicializar o Firebase e a AdMob o mais cedo possível no ciclo de vida do seu app. O local mais natural para adicionar esse código de inicialização para um projeto Cocos2d-x é no arquivo 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;
}

No Android, a criação do app Firebase exige um ambiente e uma atividade JNI. O código de amostra acima usa a classe JniHelper do Cocos2d-x para fornecer esses parâmetros.

Conseguir um anúncio pai

A AdMob requer um objeto firebase::admob::AdParent para inicializar cada formato de anúncio. Esse objeto corresponde a um Activity no Android e um UIView no iOS. A classe auxiliar a seguir cria um único método getAdParent() que retorna o objeto apropriado, dependendo da plataforma.

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
}

Adicione esta classe FirebaseHelper à pasta Classes/ do seu projeto. Adicione este arquivo ao projeto do Xcode para iOS e atualize os arquivos fonte locais no Android.mk para Android:

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

Carregar um anúncio de banner

Veja abaixo um exemplo completo de como carregar um anúncio de banner usando o método getAdParent() definido acima.

#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);
    }
  }
}

A seguir

Agora que tem o Firebase com o SDK dos anúncios para dispositivos móveis integrado ao projeto Cocos2d-x, você pode interagir com o SDK dos anúncios para dispositivos móveis e implementar seu formato preferido: