Cocos2dx v3.4 でPlugin-xを使ったAdMob表示方法を書きます。
iOS対応
Xcode上で以下のようにします。
- Plugin-x内のAdMob SDKを最新のv7に更新します。更新方法に関してはこちらを参照して行ってください
- Xcodeから「cocos2d/plugin/protocols」と「cocos2d/plugin/plugins/admob」をファイル追加します
- 先ほど追加したファイルの中でAndroid側のコードをXcode上から削除します。主に proj.android と書かれてあるフォルダが対象となります
- iOSIAPAgentでビルドエラーが発生する為、iOSの課金処理をPlugin-xで行わないのであれば以下の事を行います
・cocos2d/plugin/protocols/include/iOSIAPAgent.h で凡ミス箇所の修正
・cocos2d/plugin/protocols/platform/ios/iOSIAPAgent.mm ファイル削除 - 以下のframeworkを追加します
・StoreKit.framework
・EventKit.framework
・EventKitUI.framework
・SystemConfiguration.framework
・AdSupport.framework
・MessageUI.framework
・CoreTelephony.framework
Android対応
Eclipse上で以下のようにします。
- 「android-sdk/extras/google/google_play_services/libproject/google-play-services_lib」Workspaceをimportします
- 「cocos2d/plugin/protocols」と「cocos2d/plugin/plugins/admob」Workspaceをimportします
- google-play-services_lib、protocols、admob の順にプロジェクトをクリーンビルドします
- admobプロジェクトのPropertiesから、Android > Library へ google-play-services_lib を追加します
- admobプロジェクトをGoogle Play Services対応させます。admobプロジェクトのPropertiesをから、Java Build Path > Libraryes リストにある GoogleAdMobAdsSDK.jar を削除します。後はエラー発生箇所を地道に修正していってください。その際に以前書いたこのエントリーが役立つかと思います
- AdMob掲載対象プロジェクトのPropertiesから、Android > Library へ admob を追加します
- ここから各種ファイルのコード修正となります。AdMob掲載対象プロジェクト上で実行ください
AndroidManifest.xml
(略) <application android:label="@string/app_name" android:icon="@drawable/icon"> (中略) <!-- Google Play Serviceを追加 --> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <!-- AdMobを追加 --> <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/> </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"/> <!-- 追加 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
jni/Android.mk
(略) LOCAL_STATIC_LIBRARIES := cocos2dx_static LOCAL_STATIC_LIBRARIES += PluginProtocolStatic // ここに追加 include $(BUILD_SHARED_LIBRARY) $(call import-module,.) $(call import-module,plugin/protocols/proj.android/jni) // ここに追加
jni/hellocpp/main.cpp
void cocos_android_app_init (JNIEnv* env, jobject thiz) { LOGD("cocos_android_app_init"); AppDelegate *pAppDelegate = new AppDelegate(); // 以下の3行を追加 JavaVM* vm; env->GetJavaVM(&vm); PluginJniHelper::setJavaVM(vm); }
src/org.cocos2dx.cpp/AppActivity.java
public class AppActivity extends Cocos2dxActivity { public Cocos2dxGLSurfaceView onCreateView() { Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8); PluginWrapper.init(this); PluginWrapper.setGLSurfaceView(glSurfaceView); return glSurfaceView; } }
ビルド
ここまで変更した後、./build_native.py でビルドし、プロジェクト自体をクリーンビルドすれば終わりです。
共通コード
Cocos2d-x側で書けるiOS/Android共通コードです。
// .h typedef enum { kTypeBanner = 1, kTypeFullScreen, } AdmobType; typedef enum { kSizeBanner = 1, kSizeIABMRect, kSizeIABBanner, kSizeIABLeaderboard, kSizeSkyscraper, kSizeLargeBanner, } AdmobSizeEnum; class Hoge { private: ProtocolAds *_admob; TAdsInfo _adInfo; ProtocolAds::AdsPos _adPos; void showBanner(); void hiddenBanner();
// .cpp void Hoge::showBanner() { if (!_admob) { _admob = dynamic_cast<ProtocolAds*>(PluginManager::getInstance()->loadPlugin("AdsAdmob")); TAdsDeveloperInfo devInfo; #if CC_TARGET_PLATFORM == CC_PLATFORM_IOS devInfo["AdmobID"] = "iOSの広告ユニットID"; #elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID devInfo["AdmobID"] = "Androidの広告ユニットID"; #endif _admob->configDeveloperInfo(devInfo); _adPos = ProtocolAds::kPosBottom; _adInfo["AdmobType"] = StringUtils::format("%d", kTypeBanner); _adInfo["AdmobSizeEnum"] = StringUtils::format("%d", kSizeBanner); } _admob->showAds(_adInfo, _adPos); } void Hoge::hiddenBanner() { if (_admob) { _admob->hideAds(_adInfo); } }
AdmobType と AdmobSizeEnum は AdsAdmob.h で定義してあるものです。本当はそちらを直接参照したいのですが...
AdmobSizeEnumへの設定値はAdMobドキュメントを参照すると分かりやすいです。kSizeBanner以外は未定義だったと思いますので、他種類を増やしたい場合はiOS/Androidそれぞれのコード修正が必要になります。
他アドネットワークサービスの追加
nend/i-mobileがそれぞれCocos2dx向けにライブラリを出しているのでそちらを利用します。DL方法や実装方法は省き、いつも追加するのが煩わしいiOSの必要frameworkだけ書きます。なお、AdMob導入時のframeworkは追加済みを想定しています。
nend
- ImageIO.framework
i-mobile
- CoreLocation.framework
あとi-mobileはv3.3でCocos2dx内部パッケージが大きく変わった対応が反映されていない為、IMobileCocos2dxModule.mm を以下のように修正する必要があります。
// before #import "CCEAGLView.h" // after #import "CCEAGLView-ios.h"