2014年6月5日木曜日

Cocos2dx v3.0 で plugin-x / AdMob を利用する


Cocos2d-xフレームワークに入っているplugin-xのAdMobプラグインを利用してiOS/Android両方に対して広告掲載を行います。

試した環境は以下のようになっています。
最新だとAdMobのiOS側で64bit対応が入っていたので、今回は最新のものを使っています。

plugin-x内の説明

簡単にplugin-xプロジェクト内の説明をします。
cocos2d-x-3.x/plugin 以下が plugin-x の中身となります。利用するのは pluginsprotocolspluginsにはpluginとして用意されているサービスがフォルダ分けされており、使いたいパッケージをプロジェクトに含んで利用する形となります。
samples内にサンプルコードがあるので、各プラグインの利用方法はこちらを参照。

iOS対応

AdMobを表示する為に必要なframework

Xcodeを起動して対象プロジェクトの[TARGETS]-[General]-[Linked Frameworks and Libraries]に以下のframeworkを追加。
  • MessageUI
  • SystemConfiguration
  • StoreKit
  • CoreTelephony
  • AdSupport
  • ImageIO

ビルド設定変更

TARGETSから対象プロジェクトを選択し、[Build Setting]-[Other Linker Flags]-ObjCを追加

plugins(AdMob)、protocolsをプロジェクトへ追加

plugin-xのplugins(AdMob)とprotocolsフォルダをXcode上に追加します。そのまま適当な場所へ追加しちゃってOKですが、[proj.android]は邪魔なので除去してください(2, 3箇所あります)。

Android対応

Eclipseで行う前提で書きます。

libPluginProtocol と libPluginAdmob をEclipseへインポート

[Import]-[Existing Android Code Into Workspace]からplugin-xフォルダを指定して、libPluginProtocollibPluginAdmob だけをインポートします。

libPluginAdmobプロジェクトのPropertiesを開き、[Android]-[Library]欄でリンクエラーになっているのを削除し、先ほど追加 libPluginProtocol を追加します。

メインプロジェクトも[Properties]-[Android]-[Library]欄を開き、先ほど追加した libPluginAdmob を追加しておきます。

メインプロジェクト設定

主にビルド周りの設定となります。以下のファイルをもろもろ編集していく作業となります。追加ポイントにはコメントでplugin-x目印を付けています。

メインプロジェクト/jni/Android.mk
(略)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../cocos2d/extensions

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocostudio_static 

# plugin-x
LOCAL_WHOLE_STATIC_LIBRARIES += PluginProtocolStatic

include $(BUILD_SHARED_LIBRARY)

$(call import-module,2d)
$(call import-module,audio/android) 
$(call import-module,editor-support/cocostudio)
$(call import-module,Box2D)

# plugin-x
$(call import-module,plugin/protocols/proj.android/jni) 

メインプロジェクト/jni/hellcpp/main.cpp
#include "AppDelegate.h"
#include "cocos2d.h"
#include "CCEventType.h"
#include "platform/android/jni/JniHelper.h"
#include <jni .h="">
#include <android log.h="">
#include "PluginJniHelper.h"    // plugin-x

#define  LOG_TAG    "main"
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)

using namespace cocos2d;

void cocos_android_app_init (JNIEnv* env, jobject thiz) {
    LOGD("cocos_android_app_init");
    AppDelegate *pAppDelegate = new AppDelegate();

    // plugin-x
    JavaVM* vm;
    env->GetJavaVM(&vm);
    PluginJniHelper::setJavaVM(vm);
}

メインプロジェクト/src/org/cocos2dx/cpp/AppActivity.java
package org.cocos2dx.cpp;

import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.plugin.PluginWrapper;

public class AppActivity extends Cocos2dxActivity {
    public Cocos2dxGLSurfaceView onCreateView() {
        Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
        // TestCpp should create stencil buffer
        glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);

        PluginWrapper.init(this);
        PluginWrapper.setGLSurfaceView(glSurfaceView);
        return glSurfaceView;
    }
}

メインプロジェクト/AndroidManifest.xml
(略)
<application android:icon="@drawable/icon" android:label="@string/app_name">

    <activity android:configchanges="orientation" android:label="@string/app_name" android:name="org.cocos2dx.cpp.AppActivity" android:screenorientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
        <!-- Tell NativeActivity the name of our .so -->
        <meta-data android:name="android.app.lib_name" android:value="cocos2dcpp">
        <intent-filter>
            <action android:name="android.intent.action.MAIN">
            <category android:name="android.intent.category.LAUNCHER">
        </category></action></intent-filter>
    </meta-data></activity>
    <!-- plugin-x(AdMob) -->
    <activity android:configchanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:name="com.google.ads.AdActivity">
</activity></application> 
</application>

<supports-screens android:anyDensity="true"
                  android:smallScreens="true"
                  android:normalScreens="true"
                  android:largeScreens="true"
                  android:xlargeScreens="true"/>

<uses-permission android:name="android.permission.INTERNET"/>

<!-- plugin-x(AdMob) -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

AdMobプラグインを使って広告掲載

AdMobサイトでバナー広告のユニットを作成して、広告ユニットIDをiOS/Androidの2つ用意してください。
取得したユニットIDを使い、以下のように掲載したいlayerで実行します。(サンプルコードほぼそのままな内容です)

.h ファイル
#include "cocos2d.h"
#include "ui/CocosGUI.h"

// plugin-x(AdMob)
#include "ProtocolAds.h"
using namespace cocos2d::plugin;

USING_NS_CC;
using namespace ui;

class MyAdsListener : public cocos2d::plugin::AdsListener
{
public:
 virtual void onAdsResult(cocos2d::plugin::AdsResultCode code, const char* msg);
 virtual void onPlayerGetPoints(cocos2d::plugin::ProtocolAds* pAdsPlugin, int points);
};

class TitleScene : public Layer {
public:
    static Scene* createScene();
    CREATE_FUNC(TitleScene);
    virtual bool init();
    
private:
    // plugin-x(AdMob)
ProtocolAds *admob; MyAdsListener *listener; TAdsInfo adInfo; };

.cpp ファイル
// plugin-x(AdMob)
#include "PluginManager.h"
using namespace cocos2d::plugin;

bool TitleScene::init() {
    if (!Layer::init()) {
        return false;
    }

    // plugin-x(AdMob)
    listener = new MyAdsListener();
    admob = dynamic_cast<protocolads>(PluginManager::getInstance()->loadPlugin("AdsAdmob"));
    TAdsDeveloperInfo devInfo;
#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    devInfo["AdmobID"] = "ca-app-pub-0000000000000000/0000000000";
#elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
    devInfo["AdmobID"] = "ca-app-pub-0000000000000000/1111111111";
#endif
    admob->configDeveloperInfo(devInfo);
    admob->setAdsListener(listener);
    admob->setDebugMode(true); // TODO:Debug終了次第消す予定

    // 種類を設定。値の内容は AdsAdmob.h を参照
    adInfo["AdmobType"] = "1";
    adInfo["AdmobSizeEnum"] = "1";
    
    admob->showAds(adInfo, ProtocolAds::kPosBottom);
    return true;
}

...

組み込むのが結構大変でしたが、一度導入手順を覚えておけば次から楽できるハズ!あとprotocolsを使ってバナーライクな出し方を他でしたい時に流用できそうですね。

0 件のコメント:

コメントを投稿