2016-09-27 7 views
1

私はLibGDXでゲームをしています。これによると http://www.norakomi.com/tutorial_admob_part2_banner_ads1.php 命令私はAndroidLauncher.javaファイルで不要なメソッドを作成しました。 AndroidLauncher.javaで生成されたコアファイルでは、コントローラーを作成して、Javaファイル (http://www.norakomi.com/tutorial_admob_part2_banner_ads2.php)も作成しました。 問題は私のゲームにはいくつかのクラスがあり、それらが互いに拡張していて、adMobの表示に使用する対応する条件は、AndroidLauncher.javaファイルから "initialize"メソッドが "this"を与えるものではないということです。しかし、AndroidLauncher.javaからのみダウンロードしてadMobをリクエストすることは、別のクラスが独自のゲームビューにあるためです。AdMobインタースティシャルバナーをLibGDXゲームにいくつかのアクティビティやクラスを追加するにはどうすればよいですか?

これを解決するにはどうすればよいですか?

これはAndroidLauncher.java

public class AndroidLauncher extends AndroidApplication implements AdsController { 

private static final String BANNER_AD_UNIT_ID = "ca-app-pub-3940256099942544/6300978111"; 
    private static final String INTERSTITIAL_AD_UNIT_ID = "ca-app-pub-3940256099942544/1033173712"; 

    AdView bannerAd; 
    InterstitialAd interstitialAd;  

    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();  

// Create a gameView and a bannerAd AdView 
      View gameView = initializeForView(new Stork2016(this), config); 

      setupBanner(); 
      setupInterstitial(); 

    // Define the layout 
      RelativeLayout layout = new RelativeLayout(this); 
      layout.addView(gameView, ViewGroup.LayoutParams.MATCH_PARENT, 
        ViewGroup.LayoutParams.MATCH_PARENT); 
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT); 
      params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
      layout.addView(bannerAd, params); 

      setContentView(layout); 

      config.useCompass = false; 
      config.useAccelerometer = false; 

     public void setupBanner() { 
      bannerAd = new AdView(this); 
      //bannerAd.setVisibility(View.VISIBLE); 
      //bannerAd.setBackgroundColor(0xff000000); // black 
      bannerAd.setAdUnitId(BANNER_AD_UNIT_ID); 
      bannerAd.setAdSize(AdSize.SMART_BANNER); 
     } 

     public void setupInterstitial() { 
      interstitialAd = new InterstitialAd(this); 
      interstitialAd.setAdUnitId(INTERSTITIAL_AD_UNIT_ID); 
      AdRequest.Builder builder = new AdRequest.Builder(); 
      AdRequest ad = builder.build(); 
      interstitialAd.loadAd(ad); 

     @Override 
     public void showInterstitialAd(final Runnable then) { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        if (then != null) { 
         interstitialAd.setAdListener(new AdListener() { 
          @Override 
          public void onAdClosed() { 
           Gdx.app.postRunnable(then); 
           AdRequest.Builder builder = new AdRequest.Builder(); 
           AdRequest ad = builder.build(); 
           interstitialAd.loadAd(ad); 
          } 
         }); 
        } 
        interstitialAd.show(); 
       } 
      }); 
     } 

     @Override 
     public boolean isWifiConnected() { 
      ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
      return (ni != null && ni.isConnected()); 
     }   

     @Override 
     public void showBannerAd() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        bannerAd.setVisibility(View.VISIBLE); 
        AdRequest.Builder builder = new AdRequest.Builder(); 
        AdRequest ad = builder.build(); 
        bannerAd.loadAd(ad); 
       } 
      }); 
     } 

     @Override 
     public void hideBannerAd() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        bannerAd.setVisibility(View.INVISIBLE); 
       } 
      }); 
     } 
} 

から基本的なコードである。そして、我々は我々がAndroidLauncher.javaに追加するためのメソッドを使用できるようにAdsControllerを作成したファイルStork2016.javaを持っています。

private AdsController adsController; 

public Stork2016(AdsController adsController){ 
     this.adsController = adsController; 
    } 
@Override 
    public void create() { 
     adsController.showBannerAd(); 
     batch = new SpriteBatch(); 
     gsm = new GameStateManager(); 
     music = Gdx.audio.newMusic(Gdx.files.internal("music.mp3")); 
     music.setLooping(true); 
     music.setVolume(0.5f); 
     music.play(); 
     Gdx.gl.glClearColor(1, 0, 0, 1); 
     gsm.push(new MenuState(gsm));  
    } 

そしてまた、我々は我々がStork2016で見ることができるように、我々は持っているので、AdsController.java

public interface AdsController {  
    public void showBannerAd(); 
    public void hideBannerAd(); 
    public void showInterstitialAd (Runnable then); 
    public boolean isWifiConnected();  
} 

をインタフェースjavaファイルを持っている "gsm.push(新MenuState(GSM));" MenuState.javaには「gsm.set(新しいPlayState(gsm));」があります。 PlayState.javaでは、コードの一部がある:

@Override 
    public void update(float dt) { 
     handleInput(); 
     updateGround(); 
     .... 

      if (tube.collides(bird.getBounds())) 
       gsm.set(new GameOver(gsm)); 
       ... 
      } 
     }  
     camera.update();  
    } 

条件「であれば」私は間質のAdMobを表示するために使用する上記のコードをフローム。しかし、AndroidLauncher.javaからメソッドを受け取るコントローラはStork2016.javaでしか作成できないため、不可能です。また、AndroidLauncher.javaには があります。view gameView = initializeForView(新しいStork2016(config)); "this"をStork2016に転送します。コントローラはどこですか。

+1

私はあなたの質問を理解していない、私たちにいくつかのコードを提供してください – Marius

+0

コードを追加しました。 – Ihor2017

答えて

0

私の​​で、私はゲームを開始し、Insterstitialの広告を初期化します。次に、私がゲーム内から呼び出すinterfaceを初期化して、インタースティシャル広告の表示/非表示をトリガーします。例えば

私は方法showInterstitialAdを(持っている)私のインターフェイスのリスナーに、その後、Android上で私の実装は次のようになります。

@Override 
public void showCoverAd() { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      if (interstitialAd.isLoaded()) { 
       interstitialAd.show(); 
      } 
     } 
    }); 
} 

およびIOS-MOE上:

@Override 
public void showCoverAd() { 
    if (gadInterstitial.isReady()) { 
     gadInterstitial.presentFromRootViewController(uiViewController); 
    } 
} 

だから、あなたがメイクを必要とします例えば、

0

のようにインタースティシャル広告についてインターフェースリスナーが知っていることを確認してください。私の場合、AdsController.javaインターフェースはAndroidLaun cher.java:

public class AndroidLauncher extends AndroidApplication implements AdsController { ... 

し、コードのこの部分で:

View gameView = initializeForView(new Stork2016(this), config); 

我々は新しいクラスStrork2016.javaに "これを" 送ります。 クラスStork2016にあります。私はコンストラクタを作成します:

private AdsController adsController; 

public Stork2016(AdsController adsController){ 
     this.adsController = adsController; 
    } 

これは、私たちがAdsController.javaインタフェースのメソッドを使用できるようにします。

ただし、このクラスのStork2016のみです。他のクラスで使用したい場合:

gsm.push(new MenuState(gsm)); 

これは問題です。

+0

私はあなたを正しく理解しているならば、例えばシングルトンを使うべきです。私は小さな例[ここ](https://github.com/iluwatar/java-design-patterns/blob/master/singleton/src/main/java/com/iluwatar/singleton/IvoryTower.java#L28)を見つけました。 – Marius

0

OKみんな、私は問題を解決しました。 私は両方のクラスで2つのコンストラクタを作成しなければなりませんでした:AndroidLauncherとGameStateManagerクラスから初期化されるメインコアクラス。私がadmit intersititalを呼びたいクラスは、GameStateManagerクラスで説明されているgsm.pushメソッドによって作成されるためです。実際には、GameStateManagerでは既にコンストラクタが使用されています。したがって、このコンストラクタに必要なコードを追加するだけです。

関連する問題