2016-09-27 21 views
1

我在LibGDX上有一款遊戲。根據這個 http://www.norakomi.com/tutorial_admob_part2_banner_ads1.php 指令我在AndroidLauncher.java文件中創建了necessery方法。在由AndroidLauncher.java生成的核心文件中,我創建了控制器,並且還創建了接口java文件 (http://www.norakomi.com/tutorial_admob_part2_banner_ads2.php)。 問題是,我的遊戲有幾個相互延伸的類,我想用來顯示adMob的相應條件並不是從「Android初始化」向AndroidLauncher.java文件提供「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); 
       } 
      }); 
     } 
} 

然後我們有我們創造AdsController能夠在AndroidLauncher.java增加了使用方法文件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));  
    } 

而且我們有接口的Java文件AdsController.java

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

所以,我們可以看到Stork2016我們有 「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中還有 查看gameView = initializeForView(new Stork2016(this),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); 
    } 
} 

因此你需要化妝確保接口聽衆知道插頁式廣告,例如AndroidLauncher implements MyGameEventListener

0

在我的情況接口AdsController.java在AndroidLaun實現cher.java:

public class AndroidLauncher extends AndroidApplication implements AdsController { ... 

然後由這部分代碼:

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

我們發送 「這個」 新階級Strork2016.java。 而在Stork2016課堂。java我創建構造函數:

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

好吧,我已經解決了這個問題。 我不得不在兩個類中創建兩個構造器:從AndroidLauncher和類GameStateManager初始化的主要核心類。因爲我想讓admob intersitital被調用的類是由類GameStateManager中描述的方法gsm.push創建的。實際上,在GameStateManager中已經有了constuructor,所以我只需要爲這個構造函數添加必要的代碼。

相關問題