2016-09-27 2 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, не является тем, к которому метод «initialize» дает «это» из файла AndroidLauncher.java. Но загрузить и дать запрос на adMob можно только с AndroidLauncher.java, потому что другие классы находятся в собственном игровом представлении.Как добавить рекламный баннер 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); 
       } 
      }); 
     } 
} 

И тогда у нас есть файл Stork2016.java, в котором мы создаем AdsController, чтобы иметь возможность использовать методы добавляет в AndroidLauncher.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. Но это невозможно, потому что contoller, который принимает методы из AndroidLauncher.java, может быть создан только в Stork2016.java. А также в AndroidLauncher.java есть Посмотреть игруView = initializeForView (новый Stork2016 (this), config); , который передает «это» в Stork2016, где находится контроллер.

+1

Я не понимаю ваш вопрос, пожалуйста, предоставьте нам код – Marius

+0

Добавил код. – Ihor2017

ответ

0

В моей деятельности AndroidLauncher Я начинаю игру и инициализирую объявление Insterstitial. Затем я инициализирую свой interface, который я вызываю изнутри игры, чтобы вызвать показ/скрытие межстраничного объявления.

Например, у меня есть метод showInterstitialAd() в моем интерфейсе слушателя, то моя реализация на Android будет:

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

И КСН-МЭ:

@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

Если я правильно вас понимаю, вы должны использовать, например, Singleton. Я нашел небольшой пример [здесь] (https://github.com/iluwatar/java-design-patterns/blob/master/singleton/src/main/java/com/iluwatar/singleton/IvoryTower.java#L28). – Marius

0

ОК, ребята, я решил проблему. Мне пришлось создать два конструктора в обоих классах: основной основной класс, который инициализируется из AndroidLauncher и класса GameStateManager. Поскольку класс, в котором я хочу, чтобы admob interitital вызывался, создается методом gsm.push, который описан в классе GameStateManager. На самом деле, в GameStateManager уже есть constuructor, поэтому я должен только добавить к этому конструктору необходимый код.

Смежные вопросы