上図のようになって、バナーサイズの高さと、広告エリア用スプライトの高さが合わないのです。
スクリーンショットを撮って調べてみると、バナーの高さは66pxと、変換式がよくわからないサイズで描画されていました。
AdMobの通常のバナーサイズは320x50ですが、こちらは論理サイズなので、各デバイスに描画される物理サイズを知りたい場合は、別途計算する必要があります。
iOSの場合
iOSの場合は、ディスプレイがRetinaかそうでないかで、かんたんに計算できます。float scale = [[UIScreen mainScreen] scale]; float width = 320 * scale; float height = 50 * scale;cocos2d-xの場合は、setDesignResolutionSize()でOpenGLビューのスケールが変更されるので、こちらを加味した計算式は以下のような感じとなります。
float scale = [[UIScreen mainScreen] scale]; auto glview = Director::getInstance()->getOpenGLView(); float width = 320 * scale / glview->getScaleX(); float height = 50 * scale / glview->getScaleY();
Androidの場合
Androidの場合もiOSと変わらないだろうと楽観していましたが、先の画像のように計算が合わず悩みました。こういう時、Android開発の基礎が重要だとつくづく思い知らされます。
まず、バナーの物理サイズを求めるには、AdView(com.google.android.gms.ads.AdView)のgetWidth()、getHeight()で取得できるのですが、こちらは広告が一度ロードされてからでないと0を返してきてしまいます。
ありがたいことにAdSizeクラス(com.google.android.gms.ads.AdSize)に、物理サイズを取得するメソッドが用意されていました。getWidthInPixels()とgetHeightInPixels()です。
物理サイズを取得するメソッドを、以下のようにAppActivityクラスに加えておきます。
import com.google.android.gms.ads.*; public class AppActivity extends Cocos2dxActivity { private static AppActivity _appActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // staticメソッドからActivityにアクセスできるように保存しておく _appActivity = this; } // バナー型広告のアクティビティ上での実際の横幅ピクセル数を返す public static int getAdBannerWidthPhysicalPixels() { int width = AdSize.BANNER.getWidthInPixels(_appActivity); return width; } // バナー型広告のアクティビティ上での実際の縦幅ピクセル数を返す public static int getAdBannerHeightPhysicalPixels() { int height = AdSize.BANNER.getHeightInPixels(_appActivity); return height; }
上記メソッドをJNIを使ってc++から呼び出し、iOS版と同じようにOpenGLビュー上でのサイズを計算するのは以下のようになります。
float width = 0, height = 0; auto glview = Director::getInstance()->getOpenGLView(); { // 横幅 cocos2d::JniMethodInfo t; if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "getAdBannerWidthPhysicalPixels", "()I")) { jint ret = t.env->CallStaticIntMethod(t.classID, t.methodID); t.env->DeleteLocalRef(t.classID); width = ((float)ret) / glview->getScaleX(); } } { // 高さ cocos2d::JniMethodInfo t; if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "getAdBannerHeightPhysicalPixels", "()I")) { jint ret = t.env->CallStaticIntMethod(t.classID, t.methodID); t.env->DeleteLocalRef(t.classID); height = ((float)ret) / glview->getScaleY(); } }
サイズの計算ができるようになり、広告エリアのスプライトも以下のようにぴったりはまりました。
テスト環境
- Mac OS X 10.9.5
- cocos2d-x v3.2
- Google Mobile Ads SDK 6.12.0 (iOS)
- Google Play Services Rev.17 (Android)
0 件のコメント:
コメントを投稿