前回までは
・画面の重力制御
・ボールの表示
・プレイヤーの移動&移動方向の補助線
・ゲームクリア
・ゲームオーバー
・制限時間
・敵の実装
キーパー
ディフェンダー
ディフェンダー2
・当たり判定
・クラッシュエフェクト
・ステージセレクト
今回はステージ解放の条件と広告の実装をします。
※AdMobのダミー広告を表示します。
AdMobのSDKの導入が既に済んでいる想定の説明です。
ステージ解放
前回までのステージの実装だと、無条件で選択できてしまいます。
ゲームのやりこみ性をあげるために、クリアしたらどんどんステージが解放されるようにしましょう。
クリアしたステージ情報の保持
[java]
MainScene.java
private void showGameClear(){
long clearStage = SPUtil.getInstance(getBaseActivity()).getClearStage();
if(stage > clearStage){
SPUtil.getInstance(getBaseActivity()).setClearStage(stage);
}
・・・省略・・・
}
[/java]
[java]
package org.geex.battlesoccerplayer;
import android.content.Context;
import android.content.SharedPreferences;
public class SPUtil {
// 自身のインスタンス
private static SPUtil instance;
// シングルトン
public static synchronized SPUtil getInstance(Context context) {
if (instance == null) {
instance = new SPUtil(context);
}
return instance;
}
private static SharedPreferences settings;
private static SharedPreferences.Editor editor;
private SPUtil(Context context) {
settings = context.getSharedPreferences("shared_preference_1.0", 0);
editor = settings.edit();
}
public long getClearStage() {
return settings.getLong("ClearStage", 0);
}
public void setClearStage(long value) {
editor.putLong("ClearStage", value);
editor.commit();
}
}
[/java]
showGameClear時に、既に設定してあるステージクリア情報より大きい場合に更新するようにします。
(getClearStage/setClearStage)
※SPUtilの仕組みも「AndEngineでつくるAndroid 2Dゲーム」に記載があります。
[java]
StageSelectScene.java
@Override
public void init() {
if (0 <= clearStage) {
long clearStage = SPUtil.getInstance(getBaseActivity()).getClearStage();
if (1 <= clearStage) {
ButtonSprite stage2Btn = getBaseActivity().getResourceUtil()
.getButtonSprite("selectStage2.png", "selectStage2_2.png");
stage2Btn.setPosition((camera.getWidth() / 4) * 2 – (stage2Btn.getWidth() / 2), line1_height);
stage2Btn.setTag(TAG_BTN2);
stage2Btn.setOnClickListener(this);
attachChild(stage2Btn);
registerTouchArea(stage2Btn);
} else {
Sprite stage2Btn = getBaseActivity().getResourceUtil().getSprite("selectStage2_3.png");
stage2Btn.setPosition((camera.getWidth() / 4) * 2 – (stage2Btn.getWidth() / 2), line1_height);
attachChild(stage2Btn);
}
・・・省略・・・
}
[/java]
保持しているステージクリア情報を取得して、各ステージボタン表示の判定をしていきます。
>if (1 <= clearStage) {
ステージクリア情報が「1」以上の場合、ステージ「②」のボタンをボタンスプライトで表示します。
elseの場合はただのスプライトで表示して、クリックしても意味がないようにします。
これを各ステージボタン毎に設定します。
そうすると、前ステージをクリアしていない場合は、ステージ選択できないようにする制御が可能になります。
広告の実装
トップ画面の下部とステージ画面の真ん中に広告を表示します。
activity_main.xmlにLinearLayoutで画面下部と画面中央に広告表示領域を確保します。
トップページの広告
[java]
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addAdView();
}
public void addAdView(){
if(null == adView) {
adView = new AdView(this);
adView.setAdUnitId("ca-app-pub-3940256099942544/6300978111"); // テスト用ID
adView.setAdSize(AdSize.BANNER);
layout_ad = (LinearLayout) findViewById(R.id.banner1);
layout_ad.addView(adView);
//AdRequest adRequest = new AdRequest.Builder().build();
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR) // エミュレータ
.build();
adView.loadAd(adRequest);
}
}
public void removeAdView(){
layout_ad.removeView(adView);
adView = null;
}
[/java]
上記でトップ画面表示時に広告が表示できました。
ただし、このままだと画面遷移しても広告が表示されっぱなしになるので
InitialSceneで画面遷移時に広告の表示を削除します。
[java]
getBaseActivity().runOnUiThread(new Runnable(){
@Override
public void run() {
((MainActivity)getBaseActivity()).removeAdView();
}
});
[/java]
ステージ選択画面の広告
[java]
MainActivity.java
public void addAdView2(){
if(null == adView2) {
adView2 = new AdView(this);
adView2.setAdUnitId("ca-app-pub-3940256099942544/6300978111"); // テスト用ID
adView2.setAdSize(AdSize.BANNER);
layout_ad = (LinearLayout) findViewById(R.id.banner2);
layout_ad.addView(adView2);
//AdRequest adRequest = new AdRequest.Builder().build();
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR) // エミュレータ
.addTestDevice("333B0DEDC6F2112DF53F6C3579DCD5DB") // テストデバイス
.build();
adView2.loadAd(adRequest);
}
}
public void removeAdView2(){
layout_ad.removeView(adView2);
adView2 = null;
}
[/java]
[java]
StageSelectScene.java
@Override
public void init() {
getBaseActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
((MainActivity) getBaseActivity()).addAdView2();
}
});
・・・省略・・・
}
public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX,
float pTouchAreaLocalY) {
getBaseActivity().runOnUiThread(new Runnable(){
@Override
public void run() {
((MainActivity)getBaseActivity()).removeAdView2();
}
});
・・・省略・・・
}
[/java]
StageSelectSceneのinitメソッドで広告の表示をするために
addAdView2を呼び出します。
画面遷移時にremoveAdView2を呼び出します。
これで、トップ画面・ステージ選択画面に広告が表示されるようになりました。
実際にリリースする際には、「ca-app-pub-3940256099942544/6300978111」のテスト用IDを
AdMobで実際に発行した広告枠のIDに変更する必要があります。
ほぼアプリの機能が完成しました!
後は、音楽とGoogleアナリティクスの設定と画像をちゃんとしたものに差し替えを行います。
ゲームクリア時の文字の表示方法もできれば変えたい。
そろそろアプリリリースに近づいてきました!
最後までがんばるぞー