サイトのトップへ戻る

libGDX ドキュメント 日本語訳

サイト内検索

Admob を libgdxに組み込む



はじめに

この記事では、libGDXアプリでAdmobを設定する方法を説明します。この記事を書いている段階ではだいたい、 AdMob のバージョンは4.0.4 、libgdx のバージョンは0.9.1となっています。同じ手順で、Mobclix も(おそらく他の広告も)同様に動作します。AdMob のAPIとMobclix のAPIは違っているのでそれを変更するだけです。 コード例では、簡潔にするためにパッケージとインポートの行を省いています。あなたがEclipseを使っているのであれば、エラーが表示された行でCtrlキーと1キーを押すことで、必要なインポートを自動補完します。

この記事の内容がAdmobを組み込むための唯一の方法というわけではないので注意してください。ですが、私にとってはAdmobを組み込むための一つのアプローチに違いないので、誰かの役に立つことを期待してこの内容を公開することにしました。

Google は6.4.1 以前の SDKを非推奨としているので注意してください。新しくなったGoogle Mobile Ads を使用する場合の注意事項については、Google Mobile Adsを参照してください。 ありがたいことに、開発者/実装者の観点から見れば変更は非常に最小限に抑えられています。



バックグラウンド

それではlibgdx のHelloWorld サンプルを見て、このサンプルが何をやっているのかを理解してみましょう。サンプルには、 (HelloWorld.java内に)libgdx に関する全てを行うHelloWorld クラスがあります。デスクトップ環境でHelloWorld を作成して実行する、HelloWorldDesktop もあります。そして最後に、Android環境でHelloWorld を作成して実行するHelloWorldAndroid クラスもあります。それらは以下のような中身になっています。:

HelloWorldDesktop:

public class HelloWorldDesktop {
    public static void main (String[] argv) {
        new LwjglApplication(new HelloWorld(), "Hello World", 480, 320, false);
    }
}

HelloWorldAndroid:

public class HelloWorldAndroid extends AndroidApplication {
    @Override public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      initialize(new HelloWorld(), false);        
    }
}

HelloWorldIOS:

public class HelloWorldIOS extends Delegate {
    @Override
    protected IOSApplication createApplication() {
        final IOSApplicationConfiguration config = new IOSApplicationConfiguration();
        config.orientationLandscape = false;
        config.orientationPortrait = true;

        return new IOSApplication(new HelloWorld(), config);
    }
}
	

三つとも内容がかなり似ています。それらは全て new HelloWorld()を作成して、それをアプリケーションの設定を行うものに引数として渡しています。 デスクトップ環境ではLwjglApplicationに、Android 環境ではinitialize() メソッドに、IOS 環境では IOSApplication()に。 こうすることで、HelloWorld クラスはアプリケーションに関する全ての作業を行います。

initialize() メソッドについて詳しく見てみましょう。initialize() メソッドは二つの形態で実装されており、一方のメソッド内でもう一方のメソッドを呼び出しています。以下のコードには、Androidアプリケーションを設定するための項目があります。:

public void initialize(ApplicationListener listener, AndroidApplicationConfiguration config) {
	graphics = new AndroidGraphics(this, ...

	...

	requestWindowFeature(Window.FEATURE_NO_TITLE);
	getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
	getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
	setContentView(graphics.getView(), createLayoutParams());

	...
	

上記で何をしているのかを見ていきましょう:

  • いくつかパラメータを渡して AndroidGraphics オブジェクトを作成
  • ウィンドウをタイトル無しに設定
  • ウィンドウをフルスクリーンに設定
  • AndroidGraphics オブジェクトから取得したview情報といくつかのlayoutパラメータを引数として渡し、 setContentView() を実行

最後の行では全てのパラメータをまとめて設定して、Activity がメインの(そして唯一の)Viewとしてlibgdx viewを使うよう設定しています。 Android のActivity とView が何なのかまでは説明しません。Google に検索すれば必要な情報がすぐに見つかるでしょう。

このバックグラウンドでは、 アプリケーションにAdmobを追加するにはどういった変更が必要かを見ていきましょう。



設定

組み込みを開始するには、通常と同じ様にAdmob設定手順に従ってください。 Admobに登録し、Googleのサイトで広告の色と更新間隔を設定し、 AndroidManifest.xmlファイルに必要なパーミッションを追加し、有効化する、など。



初期化

Admobを理解するうえで重要な点は、Admobは独自のViewを使用しているということです。そして、ご存知の通りlibgdx でもViewを作成して使用しています。libgdx のViewを引数として渡してsetContentView() を実行した場合は、 libgdx のViewがアプリケーションと結びついてしまうので、AdMob のViewを追加する余地がありません。そのため以下を行う必要があります:

  • 複数のViewを内包できる Layout を作成
  • libgdx のViewを作成し、Layoutに追加
  • 同じ様に、 AdMob のviewを作成して Layout に追加
  • そのLayoutを引数として渡してsetContentView() を実行

それでは、いくつかコードを見てみましょう。RelativeLayout クラスを使うと画面上に複数のViewを重ねて表示するのが簡単なので、今回の例では RelativeLayout クラスを使用しています。ここではlibgdx のViewをフルスクリーンで表示し、AdMob のViewを画面上部にオーバーラップ表示させることを想定しています。 画面を分割してlibgdx のViewの隣にAdMob のViewを配置する、といったようなレイアウトをしたい場合は、別のLayout を使用してそのLayoutに応じて設定をする必要があるでしょう。

まず最初に、RelativeLayoutを作成します:

	RelativeLayout layout = new RelativeLayout(this);

これは簡単ですね。それから、libgdx のViewを作成する必要があります。ここでは以前に説明したものとは別の初期化用関数、 initializeForView()を使って初期化を行います。これは initialize()と似ていますが、 libgdx のViewを引数として渡して setContentView() を実行するのではなく、 View を戻り値として返すのでそのViewを使用します。 これの呼び出し方は initialize()の呼び出し方と同じです:

	View gameView = initializeForView(new HelloWorld(), false);

では、 initializeForView()の中身を詳しく見ていきましょう。initializeと同じく、initializeForViewも二つのバージョンが実装されており、処理の大部分はこの中に記述されています。:

	public View initializeForView(ApplicationListener listener, AndroidApplicationConfiguration config) {
		graphics = new AndroidGraphics(this, ...

		...

		return graphics.getView();
	}

この時、Activityのフルスクリーン設定、タイトルの消去、などについてはこの関数内では一切行わないので注意してください。 大抵の場合はそういった設定を行いたいと思うので、AndroidActivity内でそれらを設定するようにしてください:

	requestWindowFeature(Window.FEATURE_NO_TITLE);
	getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
		WindowManager.LayoutParams.FLAG_FULLSCREEN);
	getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

	View gameView = initializeForView(new HelloWorld(), false);

これでlibGDXのViewの設定は完了です。次に AdMob のview を作成し、loadAd()を実行して広告配信の開始します。 これはあなたが広告の受信をすぐに開始したい場合を想定しています。 広告の動作をもっとカスタマイズしたい場合は、それに応じてAdView を設定する必要があります。ここではそれについては触れません。

	AdView adView = new AdView(this, AdSize.BANNER, "xxxxxxxx"); // Put in your secret key here
	adView.loadAd(new AdRequest());

これで一つの Layoutと二つの Viewができました。後は二つのViewをLayoutへ追加し、Activityに表示するLayoutとして使用するようAndroid へ指示します。

Viewは追加された順にスタック処理されるので、AbmobのViewの下に libgdx のView を表示するためには最初に libgdx のViewを追加するようにしてください 追加の順番を逆にしてしまうとフルスクリーンのlibgdx のViewによってAdMob のViewが隠れてしまい、広告が表示されないのでおかしなことになってしまいます。

ではlibgdx のViewを追加しましょう。libgdxのviewはフルスクリーン表示のため位置情報を設定する必要が無いので、 簡単に addView()の形式で設定できます。

        layout.addView(gameView);

これで、今度は AdMob のViewを追加する必要があります。広告は画面の任意の位置に配置したいことでしょうから、ここではおそらくlibgdxの時よりももっと細かい制御をしたいと思っていることでしょう。レイアウトパラメータを設定できる別のaddView()があるので、それを使ってみましょう。 今回の例では、AdMob のviewのサイズを広告を完全に表示するのに必要な大きさに設定し、画面の右上に配置するよう、Android に対して指示をしています。 (厳密に言うと、Admobのviewは親の右上に配置されます。ですが親は画面全体を埋め尽くしているLayoutのことなので、 事実上は画面の右上に配置されます):

        RelativeLayout.LayoutParams adParams = 
	            new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
	                    RelativeLayout.LayoutParams.WRAP_CONTENT);
	        adParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
	        adParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

それからこれらのレイアウトパラメータを使って AdMob のView を追加します:

        layout.addView(adView, adParams);

そして最後に、このレイアウトを使うようAndroidに指示をして完了です:

        setContentView(layout);

これまでの内容を全てまとめると、以下のようになります:

public class HelloWorldAndroid extends AndroidApplication {
	    @Override public void onCreate (Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);

	        // Create the layout
	        RelativeLayout layout = new RelativeLayout(this);

	        // Do the stuff that initialize() would do for you
	        requestWindowFeature(Window.FEATURE_NO_TITLE);
	        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
	                WindowManager.LayoutParams.FLAG_FULLSCREEN);
	        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

	        // Create the libgdx View
	        View gameView = initializeForView(new HelloWorld(), false);

	        // Create and setup the AdMob view
	        AdView adView = new AdView(this, AdSize.BANNER, "xxxxxxxx"); // Put in your secret key here
	        adView.loadAd(new AdRequest());

	        // Add the libgdx view
	        layout.addView(gameView);

	        // Add the AdMob view
	        RelativeLayout.LayoutParams adParams = 
	            new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
	                    RelativeLayout.LayoutParams.WRAP_CONTENT);
	        adParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
	        adParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

	        layout.addView(adView, adParams);

	        // Hook it all up
	        setContentView(layout);
	    }

以上です。これであなたのlibgdxアプリの上部に広告が表示されます。広告を常に表示された状態にするのであれば、必要な作業は全て完了です。 広告が表示される際にlibgdx アプリ内からそれを制御したい場合は、もう少しやることが残っています。



広告を制御する

この例ではlibgdx アプリ内からAdMob Viewの表示・非表示の切り替えを行う方法を説明します。 これはおそらくAdMobを制御する最良の方法というわけではないので注意してください。 あなたのad Viewが非表示なのにバックグラウンドで広告を取得したままの場合は、広告の表示回数を無駄にしているのであなたの広告収入に悪い影響を与えてしまいます。 AdMob viewを制御する最良の方法についてまで説明することはありません。 - それはアプリケーションによって異なるからです。 また、ウェブサイト上で行えるものとアプリ内から行えるものがあります。 ですから、詳細についてはAdMob のドキュメントを参照してください。

まず最初にやるべきことは、AndroidApplication内でAdView のメンバを定義することです。これは、後からAdView を参照する必要があるためです。

public class HelloWorldAndroid extends AndroidApplication {
	    protected AdView adView;

	    @Override public void onCreate (Bundle savedInstanceState) {

	...

	      adView = new AdView(this, AdSize.BANNER, "xxxxxxxx"); // Put in your secret key here

次に理解するべきことは、 Handlerについてです。これは、スレッド間でメッセージを送信するための Android のメカニズムです。 HelloWorld アプリは独自のスレッド上(これは'ゲームスレッド'と呼びましょう)で動作します。このスレッドは、AdView が作成されたスレッド('UI スレッド')とは異なります。 UI スレッド以外のスレッドからAdView を操作しようとすると、 AdMobは (ついでに言えばその他多くのライブラリでも) ご機嫌斜めになってしまいます。 では、どうすれば良いのでしょうか? 他のスレッドから、UIスレッドに対してメッセージを送り返すのです。 次にUI スレッドの実行がスケジュールされた時に、そのメッセージが取得されて該当アクションを実行します。 これは全てHandlerと呼ばれるものによって制御されます。それでは、その設定方法を見てみましょう:

public class HelloWorldAndroid extends AndroidApplication {

	    private final int SHOW_ADS = 1;
	    private final int HIDE_ADS = 0;

	    protected Handler handler = new Handler()
	    {
	        @Override
	        public void handleMessage(Message msg) {
	            switch(msg.what) {
	                case SHOW_ADS:
	                {
	                    adView.setVisibility(View.VISIBLE);
	                    break;
	                }
	                case HIDE_ADS:
	                {
	                    adView.setVisibility(View.GONE);
	                    break;
	                }
	            }
	        }
	    };

これはメッセージを処理する部分です。二つの定数 - SHOW_ADSHIDE_ADSを定義しました。 このメッセージがこれらの定数のうちどちらかを保持していた場合は、指示に従ってこのコードでAdView の表示・非表示を切り替えます。

まだ必要なものが二つ残っています:

  • SHOW_ADS命令や HIDE_ADS 命令を保持したメッセージを送信するためのコード
  • libgdx アプリのゲームスレッド内からこのコードを呼び出すための方法

この問題を解決するにはいくつかの方法があります。 One solution is to use an interface that defines functionality that the AndroidApplication can provide, like the ability to show and hide ads. ここでは、そうしたinterfaceを定義します。このinterfaceは専用のJavaファイルに記述する必要があるので注意してください:

IActivityRequestHandler.java:

public interface IActivityRequestHandler {
	   public void showAds(boolean show);
	}
	

この interface は一つの関数 showAds()を定義しているだけです。 ゲームスレッドから呼び出してUI内で実行する必要がある機能を別途後から追加したい場合は、ここにメソッドを追加できます。

これでinterfaceが用意できたので、 この interfaceをAndroidApplication で実装します:

public class HelloWorldAndroid extends AndroidApplication implements IActivityRequestHandler  {

	...

	    // This is the callback that posts a message for the handler
	    @Override
	    public void showAds(boolean show) {
	       handler.sendEmptyMessage(show ? SHOW_ADS : HIDE_ADS);
	    }

そしてAndroidApplication内でshowAds() 関数を実装します。これはとても簡単です - この関数でメッセージを Handlerに送信します。 sendEmptyMessage は、今回のように一つのコードのみを保持する必要があるメッセージの場合に便利です。 メッセージを使ってより多くの情報を伝える必要がある場合は、より複雑なメッセージを送信する必要があります。メッセージを処理するハンドラーコードもそれに応じて変更する必要があります。

これでUIスレッドにメッセージを送信するためのメカニズムが用意でき、UIスレッドがメッセージを処理できるようになりました。 これを実行するには、HelloWorld オブジェクトがshowAds()関数を呼び出すことができるようにするため、HelloWorldAndroidオブジェクトを認識している必要があります。 そのための一つの方法は、パラメータを受け取ることができるHelloWorld コンストラクタを定義することです:

public class HelloWorld implements ApplicationListener {
	    private IActivityRequestHandler myRequestHandler;

	    public HelloWorld(IActivityRequestHandler handler) {
	        myRequestHandler = handler;
	    }

これによってコンストラクタ経由で渡されたIActivityRequestHandler への参照を保持しておくことができます。 これで、オブジェクト内のどこからでもmyRequestHandler にアクセスできるようになったので、広告を有効にする場合は以下を実行するだけです:

    myRequestHandler.showAds(true);

HelloWorldAndroid クラスに戻りましょう。以下の新しいコンストラクタを実装した HelloWorld を作成する必要があります:

        View gameView = initializeForView(new HelloWorld(this), false);

HelloWorld コンストラクタに渡しているthis パラメータに注目してください - このようにしてHelloWorldAndroid オブジェクトへの参照をHelloWorld オブジェクトへ渡します。

まだやり残していることが一つだけあります。 デスクトップ版のことを思い出してください。 - デスクトップ版でもAndroid版と同様に新しいコンストラクタを呼び出すように修正する必要があります。これを行うためには、Android版のHelloWorld クラスでshowAds()を呼び出せるようにした時と同様に、HelloWorldDesktop でも IActivityRequestHandler interface を実装する必要があります。 ですが、デスクトップ版では表示するための広告が無いので、ここでの実装は空にすることができます。 main() は静的関数でこれを実行している時にthis パラメータは存在しないので、ズルいやり方を使う必要があります。 以下のような解決方法でも動作自体はしますが、おそらくこれよりも良い制御方法があるかもしれません:

public class HelloWorldDesktop implements IActivityRequestHandler {
	    private static HelloWorldDesktop application;
	    public static void main (String[] argv) {
	        if (application == null) {
	            application = new HelloWorldDesktop();
	        }

	        new LwjglApplication(new HelloWorld(application), "Hello World", 480, 320, false);
	    }

	    @Override
	    public void showAds(boolean show) {
	        // TODO Auto-generated method stub

	    }
	}

これで完了です。これでlibgdxアプリ内からAdmob広告の表示・非表示を行えるようになりました。



コード

ここでは、前述の全てのクラスに関する完全なコードを記述しておきます:

HelloWorldAndroid.java:

/*******************************************************************************
	 * Copyright 2011 See AUTHORS file.
	 * 
	 * Licensed under the Apache License, Version 2.0 (the "License");
	 * you may not use this file except in compliance with the License.
	 * You may obtain a copy of the License at
	 * 
	 *   http://www.apache.org/licenses/LICENSE-2.0
	 * 
	 * Unless required by applicable law or agreed to in writing, software
	 * distributed under the License is distributed on an "AS IS" BASIS,
	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	 * See the License for the specific language governing permissions and
	 * limitations under the License.
	 ******************************************************************************/
	/*
	 * Copyright 2010 Mario Zechner (contact@badlogicgames.com), Nathan Sweet (admin@esotericsoftware.com)
	 * 
	 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
	 * License. You may obtain a copy of the License at
	 * 
	 * http://www.apache.org/licenses/LICENSE-2.0
	 * 
	 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
	 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language
	 * governing permissions and limitations under the License.
	 */

	package com.badlogic.gdx;

	import android.os.Bundle;
	import android.os.Handler;
	import android.os.Message;
	import android.view.View;
	import android.view.Window;
	import android.view.WindowManager;
	import android.widget.RelativeLayout;

	import com.badlogic.gdx.backends.android.AndroidApplication;
	import com.badlogic.gdx.helloworld.HelloWorld;
	import com.badlogic.gdx.helloworld.IActivityRequestHandler;
	import com.mobclix.android.sdk.MobclixMMABannerXLAdView;

	public class HelloWorldAndroid extends AndroidApplication implements IActivityRequestHandler  {

	    protected AdView adView;

	    private final int SHOW_ADS = 1;
	    private final int HIDE_ADS = 0;

	    protected Handler handler = new Handler()
	    {
	        @Override
	        public void handleMessage(Message msg) {
	            switch(msg.what) {
	                case SHOW_ADS:
	                {
	                    adView.setVisibility(View.VISIBLE);
	                    break;
	                }
	                case HIDE_ADS:
	                {
	                    adView.setVisibility(View.GONE);
	                    break;
	                }
	            }
	        }
	    };

	    @Override public void onCreate (Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);

	        // Create the layout
	        RelativeLayout layout = new RelativeLayout(this);

	        // Do the stuff that initialize() would do for you
	        requestWindowFeature(Window.FEATURE_NO_TITLE);
	        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
	                WindowManager.LayoutParams.FLAG_FULLSCREEN);
	        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

	        // Create the libgdx View
	        View gameView = initializeForView(new HelloWorld(this), false);

	        // Create and setup the AdMob view
	        adView = new AdView(this, AdSize.BANNER, "xxxxxxxx"); // Put in your secret key here
	        adView.loadAd(new AdRequest());

	        // Add the libgdx view
	        layout.addView(gameView);

	        // Add the AdMob view
	        RelativeLayout.LayoutParams adParams = 
	            new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
	                    RelativeLayout.LayoutParams.WRAP_CONTENT);
	        adParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
	        adParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

	        layout.addView(adView, adParams);

	        // Hook it all up
	        setContentView(layout);
	    }

	    // This is the callback that posts a message for the handler
	    @Override
	    public void showAds(boolean show) {
	       handler.sendEmptyMessage(show ? SHOW_ADS : HIDE_ADS);
	    }
	}

HelloWorldDesktop.java:

/*******************************************************************************
	 * Copyright 2011 See AUTHORS file.
	 * 
	 * Licensed under the Apache License, Version 2.0 (the "License");
	 * you may not use this file except in compliance with the License.
	 * You may obtain a copy of the License at
	 * 
	 *   http://www.apache.org/licenses/LICENSE-2.0
	 * 
	 * Unless required by applicable law or agreed to in writing, software
	 * distributed under the License is distributed on an "AS IS" BASIS,
	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	 * See the License for the specific language governing permissions and
	 * limitations under the License.
	 ******************************************************************************/
	package com.badlogic.gdx.helloworld;

	import com.badlogic.gdx.backends.lwjgl.LwjglApplication;

	public class HelloWorldDesktop implements IActivityRequestHandler {
	    private static HelloWorldDesktop application;
	    public static void main (String[] argv) {
	        if (application == null) {
	            application = new HelloWorldDesktop();
	        }

	        new LwjglApplication(new HelloWorld(application), "Hello World", 480, 320, false);
	    }

	    @Override
	    public void showAds(boolean show) {
	        // TODO Auto-generated method stub

	    }
	}

HelloWorld.java:

/*******************************************************************************
	 * Copyright 2011 See AUTHORS file.
	 * 
	 * Licensed under the Apache License, Version 2.0 (the "License");
	 * you may not use this file except in compliance with the License.
	 * You may obtain a copy of the License at
	 * 
	 *   http://www.apache.org/licenses/LICENSE-2.0
	 * 
	 * Unless required by applicable law or agreed to in writing, software
	 * distributed under the License is distributed on an "AS IS" BASIS,
	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	 * See the License for the specific language governing permissions and
	 * limitations under the License.
	 ******************************************************************************/
	package com.badlogic.gdx.helloworld;

	import com.badlogic.gdx.ApplicationListener;
	import com.badlogic.gdx.Files.FileType;
	import com.badlogic.gdx.Gdx;
	import com.badlogic.gdx.graphics.Color;
	import com.badlogic.gdx.graphics.GL10;
	import com.badlogic.gdx.graphics.Texture;
	import com.badlogic.gdx.graphics.Texture.TextureFilter;
	import com.badlogic.gdx.graphics.Texture.TextureWrap;
	import com.badlogic.gdx.graphics.g2d.BitmapFont;
	import com.badlogic.gdx.graphics.g2d.SpriteBatch;
	import com.badlogic.gdx.math.Vector2;

	public class HelloWorld implements ApplicationListener {
	    SpriteBatch spriteBatch;
	    Texture texture;
	    BitmapFont font;
	    Vector2 textPosition = new Vector2(100, 100);
	    Vector2 textDirection = new Vector2(1, 1);

	    private IActivityRequestHandler myRequestHandler;

	    public HelloWorld(IActivityRequestHandler handler) {
	        myRequestHandler = handler;
	    }

	    @Override public void create () {
	        font = new BitmapFont();
	        font.setColor(Color.RED);
	        texture = new Texture(Gdx.files.internal("data/badlogic.jpg"));
	        spriteBatch = new SpriteBatch();
	    }

	    @Override public void render () {
	        int centerX = Gdx.graphics.getWidth() / 2;
	        int centerY = Gdx.graphics.getHeight() / 2;

	        Gdx.graphics.getGL10().glClear(GL10.GL_COLOR_BUFFER_BIT);

	        // more fun but confusing :)
	        //textPosition.add(textDirection.tmp().mul(Gdx.graphics.getDeltaTime()).mul(60));
	        textPosition.x += textDirection.x * Gdx.graphics.getDeltaTime() * 60;
	        textPosition.y += textDirection.y * Gdx.graphics.getDeltaTime() * 60;

	        if (textPosition.x < 0 ) {
	            textDirection.x = -textDirection.x;
	            textPosition.x = 0;
	        }
	        if(textPosition.x > Gdx.graphics.getWidth()) {
	            textDirection.x = -textDirection.x;
	            textPosition.x = Gdx.graphics.getWidth();
	        }
	        if (textPosition.y < 0) {
	            textDirection.y = -textDirection.y;
	            textPosition.y = 0;         
	        }
	        if (textPosition.y > Gdx.graphics.getHeight()) {
	            textDirection.y = -textDirection.y;
	            textPosition.y = Gdx.graphics.getHeight();          
	        }

	        spriteBatch.begin();
	        spriteBatch.setColor(Color.WHITE);
	        spriteBatch.draw(texture, 
	                              centerX - texture.getWidth() / 2, 
	                              centerY - texture.getHeight() / 2, 
	                              0, 0, texture.getWidth(), texture.getHeight());       
	        font.draw(spriteBatch, "Hello World!", (int)textPosition.x, (int)textPosition.y);
	        spriteBatch.end();
	    }

	    @Override public void resize (int width, int height) {
	        spriteBatch.getProjectionMatrix().setToOrtho2D(0, 0, width, height);
	        textPosition.set(0, 0);
	    }

	    @Override public void pause () {

	    }

	    @Override public void resume () {

	    }

	    @Override public void dispose () {

	    }

	}


iOS での設定(RoboVM)

admob を IOS 上で動作させるには、以下のことを行うと良いでしょう:

  • プロジェクトでは最新版の libgdx を使うようにする

  • 最新版のRoboVMを使うようにする

  • このページrobovm-ios-bindings - admobにある最新版のadmob bindings を使うようにする

  • Admob では iOS用の個別の広告ユニットが必要なので, Android用に使っているのとは別のappキーを新たに作成するようにする。


  1. robovm admob bindings が準備できたら、そのままそれを統合開発環境にインポートします。

  2. この時点では、xxxx-robovmプロジェクトとインポートされたadmob robovm bindings プロジェクトが準備できているはずです。

  3. robovm bindings project にあるlibadmob.aファイルを libs/ios ディレクトリへコピーします。

  4. xxxx-robovm プロジェクト内にある robovm.xml ファイルを開き、以下のように lib を追加します:

    <libs>
        <lib>libs/ios/libgdx.a</lib>
        <lib>libs/ios/libObjectAL.a</lib>
        <lib>libs/ios/libadmob.a</lib>
    </libs>
  1. また robovm.xml ファイル内に AdSupport weakFrameworkを追加し、完成した weakFrameworks は以下のようになります:
    <weakFrameworks>
      <framework>AdSupport</framework>
      <framework>StoreKit</framework>
    </weakFrameworks>
  1. 今度はrobovm admob bindingsプロジェクトへのプロジェクトリファレンスを追加する必要があります。(このやり方はあなたが使用している統合開発環境によって変わってきます)

  2. これで環境設定は完了しました。広告の設定方法については以下のコードを参照してください。今のところ、この例では広告は画面の上部に配置されます。

package com.badlogic.gdx;

import org.robovm.apple.coregraphics.CGRect;
import org.robovm.apple.coregraphics.CGSize;
import org.robovm.apple.foundation.NSArray;
import org.robovm.apple.foundation.NSAutoreleasePool;
import org.robovm.apple.foundation.NSObject;
import org.robovm.apple.foundation.NSString;
import org.robovm.apple.uikit.UIApplication;
import org.robovm.apple.uikit.UIScreen;
import org.robovm.bindings.admob.GADAdSizeManager;
import org.robovm.bindings.admob.GADBannerView;
import org.robovm.bindings.admob.GADBannerViewDelegateAdapter;
import org.robovm.bindings.admob.GADRequest;
import org.robovm.bindings.admob.GADRequestError;

import com.badlogic.gdx.Application;
import com.badlogic.gdx.backends.iosrobovm.IOSApplication;
import com.badlogic.gdx.backends.iosrobovm.IOSApplication.Delegate;
import com.badlogic.gdx.backends.iosrobovm.IOSApplicationConfiguration;
import com.badlogic.gdx.utils.Logger;

public class HelloWorldIOS extends Delegate implements IActivityRequestHandler {
    private static final Logger log = new Logger(HelloWorldIOS.class.getName(), Application.LOG_DEBUG);
    private static final boolean USE_TEST_DEVICES = true;
    private GADBannerView adview;
    private boolean adsInitialized = false;
    private IOSApplication iosApplication;

    @Override
    protected IOSApplication createApplication() {
        final IOSApplicationConfiguration config = new IOSApplicationConfiguration();
        config.orientationLandscape = false;
        config.orientationPortrait = true;

        iosApplication = new IOSApplication(new HelloWorld(this), config);
        return iosApplication;
    }

    public static void main(String[] argv) {
        NSAutoreleasePool pool = new NSAutoreleasePool();
        UIApplication.main(argv, null, HelloWorldIOS.class);
        pool.close();
    }

    @Override
    public void hide() {
        initializeAds();

        final CGSize screenSize = UIScreen.getMainScreen().getBounds().size();
        double screenWidth = screenSize.width();

        final CGSize adSize = adview.getBounds().size();
        double adWidth = adSize.width();
        double adHeight = adSize.height();

        log.debug(String.format("Hidding ad. size[%s, %s]", adWidth, adHeight));

        float bannerWidth = (float) screenWidth;
        float bannerHeight = (float) (bannerWidth / adWidth * adHeight);

        adview.setFrame(new CGRect(0, -bannerHeight, bannerWidth, bannerHeight));
    }

    @Override
    public void show() {
        initializeAds();

        final CGSize screenSize = UIScreen.getMainScreen().getBounds().size();
        double screenWidth = screenSize.width();

        final CGSize adSize = adview.getBounds().size();
        double adWidth = adSize.width();
        double adHeight = adSize.height();

        log.debug(String.format("Showing ad. size[%s, %s]", adWidth, adHeight));

        float bannerWidth = (float) screenWidth;
        float bannerHeight = (float) (bannerWidth / adWidth * adHeight);

        adview.setFrame(new CGRect((screenWidth / 2) - adWidth / 2, 0, bannerWidth, bannerHeight));
    }

    public void initializeAds() {
        if (!adsInitialized) {
            log.debug("Initalizing ads...");

            adsInitialized = true;

            adview = new GADBannerView(GADAdSizeManager.smartBannerPortrait());
            adview.setAdUnitID("xxxxxxxx"); //put your secret key here
            adview.setRootViewController(iosApplication.getUIViewController());
            iosApplication.getUIViewController().getView().addSubview(adview);

            final GADRequest request = GADRequest.request();
            if (USE_TEST_DEVICES) {
                final NSArray<?> testDevices = new NSArray<NSObject>(
                        new NSString(GADRequest.GAD_SIMULATOR_ID));
                request.setTestDevices(testDevices);
                log.debug("Test devices: " + request.getTestDevices());
            }

            adview.setDelegate(new GADBannerViewDelegateAdapter() {
                @Override
                public void didReceiveAd(GADBannerView view) {
                    super.didReceiveAd(view);
                    log.debug("didReceiveAd");
                }

                @Override
                public void didFailToReceiveAd(GADBannerView view,
                        GADRequestError error) {
                    super.didFailToReceiveAd(view, error);
                    log.debug("didFailToReceiveAd:" + error);
                }
            });

            adview.loadRequest(request);

            log.debug("Initalizing ads complete.");
        }
    }

    @Override
    public void showAds(boolean show) {
        initializeAds();

        final CGSize screenSize = UIScreen.getMainScreen().getBounds().size();
        double screenWidth = screenSize.width();

        final CGSize adSize = adview.getBounds().size();
        double adWidth = adSize.width();
        double adHeight = adSize.height();

        log.debug(String.format("Hidding ad. size[%s, %s]", adWidth, adHeight));

        float bannerWidth = (float) screenWidth;
        float bannerHeight = (float) (bannerWidth / adWidth * adHeight);

        if(show) {
            adview.setFrame(new CGRect((screenWidth / 2) - adWidth / 2, 0, bannerWidth, bannerHeight));
        } else {
            adview.setFrame(new CGRect(0, -bannerHeight, bannerWidth, bannerHeight));
        }
    }
}