2017-06-20 80 views
1

我找到了一個Flappy Bird GitHub項目並稍加改動了一下。 我成功實施了AdMob橫幅。如何在LibGDX項目中顯示插頁式廣告?

但現在我也想(當然每次都沒有),一個插頁式廣告會彈出時,遊戲就結束了所以這裏是我的GitHub項目:https://github.com/DaFaack/FlappyBibi

請解釋我如何做到這一點,因爲我可以」在互聯網上找到一個很好的解釋。

我想在run()方法中顯示廣告。您可以在覈心軟件包 - >GameplayScreen.java文件 - >renderPlaying()方法中找到它,然後使用run()方法。

這方法我說的是:

private void renderPlaying() { 
     if (justTouched) { 
      bird.jump(); 
      justTouched = false; 

     } 
     updatePipePairs(); 
     gameplayStage.act(); 
     uiStage.act(); 
     checkCollisions(); 
     if (bird.getState() == Bird.State.DYING) { 
      stopTheWorld(); 


      RunnableAction playWooshAction = Actions.run(new Runnable() { 
       @Override 
       public void run() { 
        com.pentagames.flappybibi.Assets.playWooshSound(); 

//Here I want to display the Interstitial Ad! 

       } 
      }); 

我有什麼做的,顯示插頁廣告時,遊戲就結束了?

這是我AndroidLauncher.java文件:

package com.pentagames.flappybibi.android; 

import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.RelativeLayout; 

import com.badlogic.gdx.backends.android.AndroidApplication; 
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; 
import com.google.android.gms.ads.AdListener; 
import com.google.android.gms.ads.AdRequest; 
import com.google.android.gms.ads.AdSize; 
import com.google.android.gms.ads.AdView; 
import com.pentagames.flappybibi.FlappyGame; 

public class AndroidLauncher extends AndroidApplication{ 

    private static final String TAG = "AndroidLauncher"; 
    protected AdView adView; 

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

     RelativeLayout layout = new RelativeLayout(this); 

     AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); 
     View gameView=initializeForView(new FlappyGame(), config); 
     layout.addView(gameView); 

     adView = new AdView(this); 
     adView.setAdListener(new AdListener(){ 
      @Override 
      public void onAdLoaded(){ 
       int visibility = adView.getVisibility(); 
       adView.setVisibility(AdView.GONE); 
       adView.setVisibility(AdView.VISIBLE); 
       Log.i(TAG, "Ad Loaded..."); 
      } 
     }); 
     adView.setAdSize(AdSize.SMART_BANNER); 
     adView.setAdUnitId("ca-app-pub-XXXXXXXXXXXXXX/XXXXXXXXX"); 

     AdRequest.Builder builder = new AdRequest.Builder(); 
     RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.MATCH_PARENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT 
     ); 
     adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); 
     adParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); 

     layout.addView(adView, adParams); 
     adView.loadAd(builder.build()); 

     setContentView(layout); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     adView.resume(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     adView.pause(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     adView.destroy(); 
    } 
    } 

而且這個GameplayScreen文件:

package com.pentagames.flappybibi; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.InputAdapter; 
import com.badlogic.gdx.ScreenAdapter; 
import com.badlogic.gdx.graphics.Color; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.math.Interpolation; 
import com.badlogic.gdx.scenes.scene2d.Stage; 
import com.badlogic.gdx.scenes.scene2d.actions.Actions; 
import com.badlogic.gdx.scenes.scene2d.actions.RunnableAction; 
import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction; 
import com.badlogic.gdx.scenes.scene2d.ui.Image; 
import com.badlogic.gdx.scenes.scene2d.ui.Label; 
import com.badlogic.gdx.scenes.scene2d.utils.Align; 
import com.badlogic.gdx.utils.Array; 
import com.badlogic.gdx.utils.viewport.StretchViewport; 

public class GameplayScreen extends ScreenAdapter{ 

    public static final float PIPE_SPACING = 200f; 
    public static final int PIPE_SETS = 3; 

    protected OrthographicCamera camera; 
    protected com.pentagames.flappybibi.FlappyGame game; 

    private Stage gameplayStage; 
    private Stage uiStage; 
    private Label scoreLabel; 
    private Label tapToRetry; 
    private Label best; 
    private Label tapToFlap; 
    private Image whitePixel; 
    private Image backgroundBuildings; 

    private int score; 

    private Bird bird; 
    private Array<PipePair> pipePairs; 

    private com.pentagames.flappybibi.Ground ground; 

    private boolean justTouched; 

    private Color backgroundColor; 

    private State screenState = State.PREGAME; 
    private boolean allowRestart = false; 

    private enum State {PREGAME, PLAYING, DYING, DEAD} 

    public GameplayScreen(com.pentagames.flappybibi.FlappyGame game) { 
     this.game = game; 

     camera = new OrthographicCamera(com.pentagames.flappybibi.FlappyGame.WIDTH, com.pentagames.flappybibi.FlappyGame.HEIGHT); 
     gameplayStage = new Stage(new StretchViewport(com.pentagames.flappybibi.FlappyGame.WIDTH, com.pentagames.flappybibi.FlappyGame.HEIGHT, camera)); 
     uiStage = new Stage(new StretchViewport(com.pentagames.flappybibi.FlappyGame.WIDTH, com.pentagames.flappybibi.FlappyGame.HEIGHT)); 
     bird = new Bird(); 
     bird.setPosition(com.pentagames.flappybibi.FlappyGame.WIDTH * .25f, com.pentagames.flappybibi.FlappyGame.HEIGHT/2, Align.center); 
     bird.addAction(Utils.getFloatyAction()); 
     bird.setState(Bird.State.PREGAME); 

     whitePixel = new Image(com.pentagames.flappybibi.Assets.whitePixel); 

     scoreLabel = new Label("0", new Label.LabelStyle(com.pentagames.flappybibi.Assets.fontMedium, Color.WHITE)); 
     scoreLabel.setPosition(com.pentagames.flappybibi.FlappyGame.WIDTH/2, com.pentagames.flappybibi.FlappyGame.HEIGHT * .9f, Align.center); 
     uiStage.addActor(scoreLabel); 

     tapToRetry = new Label("Nochmal?", new Label.LabelStyle(com.pentagames.flappybibi.Assets.fontMedium, Color.WHITE)); 
     tapToRetry.setPosition(com.pentagames.flappybibi.FlappyGame.WIDTH/2, 0, Align.top); 
     uiStage.addActor(tapToRetry); 

     best = new Label("Highscore: ", new Label.LabelStyle(com.pentagames.flappybibi.Assets.fontMedium, Color.WHITE)); 
     best.setPosition(com.pentagames.flappybibi.FlappyGame.WIDTH/2, 0, Align.top); 
     uiStage.addActor(best); 

     tapToFlap = new Label("Fass mich an!", new Label.LabelStyle(com.pentagames.flappybibi.Assets.fontMedium, Color.WHITE)); 
     tapToFlap.setPosition(com.pentagames.flappybibi.FlappyGame.WIDTH/2, com.pentagames.flappybibi.FlappyGame.HEIGHT, Align.bottom); 
     uiStage.addActor(tapToFlap); 

     initBackgroundBuildings(); 

     pipePairs = new Array<PipePair>(); 

     ground = new com.pentagames.flappybibi.Ground(); 
     ground.setPosition(0, 0); 

     backgroundColor = Utils.getRandomBackgroundColor(); 

     // The order actors are added determines the order they are drawn so make sure the background is first 
     gameplayStage.addActor(ground); 
     gameplayStage.addActor(backgroundBuildings); 
     gameplayStage.addActor(bird); 

     // Setup the input processor 
     initInputProcessor(); 
    } 

    private void initBackgroundBuildings() { 
     backgroundBuildings = new Image(com.pentagames.flappybibi.Assets.backgroundBuildings); 
     backgroundBuildings.setWidth(com.pentagames.flappybibi.FlappyGame.WIDTH); 
     backgroundBuildings.setHeight(backgroundBuildings.getHeight()*2f); 
     backgroundBuildings.setY(com.pentagames.flappybibi.Ground.HEIGHT); 
    } 

    @Override 
    public void show() { 
     tapToFlap.addAction(Actions.moveToAligned(com.pentagames.flappybibi.FlappyGame.CENTER_X, com.pentagames.flappybibi.FlappyGame.CENTER_Y + 100f, Align.center, .75f, Interpolation.sine)); 
     com.pentagames.flappybibi.Assets.playWooshSound(); 
    } 

    @Override 
    public void render(float delta) { 

     Gdx.graphics.getGL20().glClearColor(backgroundColor.r, backgroundColor.g, backgroundColor.b, 1f); 
     Gdx.graphics.getGL20().glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); 

     switch (screenState) { 
      case PREGAME: 
       updateAndDrawStages(); 
       break; 
      case PLAYING: 
       renderPlaying(); 
       break; 
      case DYING: 
      case DEAD: 
       renderDeadOrDying(); 
       break; 
     } 
    } 

    private void renderDeadOrDying() { 
     if (bird.getState() == Bird.State.DEAD) { 
      screenState = State.DEAD; 
     } 
     updateAndDrawStages(); 
    } 

    private void renderPlaying() { 
     if (justTouched) { 
      bird.jump(); 
      justTouched = false; 

     } 
     updatePipePairs(); 
     gameplayStage.act(); 
     uiStage.act(); 
     checkCollisions(); 
     if (bird.getState() == Bird.State.DYING) { 
      stopTheWorld(); 

      RunnableAction playWooshAction = Actions.run(new Runnable() { 
       @Override 
       public void run() { 
        com.pentagames.flappybibi.Assets.playWooshSound(); 

//Here I want to display the Interstitial Ad! 

       } 
      }); 

      SequenceAction actions = Actions.sequence(Actions.delay(1f), playWooshAction, Actions.moveToAligned(com.pentagames.flappybibi.FlappyGame.CENTER_X, com.pentagames.flappybibi.FlappyGame.CENTER_Y, Align.bottom, 
        .75f, Interpolation.sine), Actions.run(new Runnable() { 
       @Override 
       public void run() { 
        // Allow the player to restart the game once the tap to retry finishes coming up 
        allowRestart = true; 
       } 
      })); 
      tapToRetry.addAction(actions); 

      best.setText("Highscore: " + com.pentagames.flappybibi.SavedDataManager.getInstance().getHighScore()); 
      best.setWidth(best.getTextBounds().width); 
      best.setPosition(com.pentagames.flappybibi.FlappyGame.CENTER_X, 0, Align.top); 
      best.addAction(Actions.delay(1f, Actions.moveToAligned(com.pentagames.flappybibi.FlappyGame.CENTER_X, com.pentagames.flappybibi.FlappyGame.CENTER_Y, Align.top, 
        .75f, Interpolation.sine))); 

      screenState = State.DYING; 
     } 
     gameplayStage.draw(); 
     uiStage.draw(); 
    } 

    private void updateAndDrawStages() { 
     gameplayStage.act(); 
     gameplayStage.draw(); 
     uiStage.act(); 
     uiStage.draw(); 
    } 

    @Override 
    public void resize(int width, int height) { 

     camera.setToOrtho(false, width, height); 
     com.pentagames.flappybibi.Assets.batch.setProjectionMatrix(camera.combined); 
     gameplayStage.getViewport().update(width, height, true); 
     uiStage.getViewport().update(width, height, true); 

    } 

    @Override 
    public void dispose() { 
     gameplayStage.dispose(); 
     uiStage.dispose(); 
    } 

    private void checkCollisions() { 

     for (int i = 0; i < pipePairs.size; i++) { 
      PipePair pair = pipePairs.get(i); 
      if (pair.getBottomPipe().getBounds().overlaps(bird.getBounds()) || pair.getTopPipe().getBounds().overlaps(bird.getBounds())) { 
       stopTheWorld(); 
       com.pentagames.flappybibi.SavedDataManager.getInstance().setHighScore(score); 
       showWhiteScreen(); 
      } else if (bird.isBelowGround()) { 
       bird.setY(com.pentagames.flappybibi.FlappyGame.GROUND_LEVEL); 
       bird.clearActions(); 
       bird.setToDying(); 
       showWhiteScreen(); 
      } else if (bird.isAboveCeiling()) { 
       bird.setY(com.pentagames.flappybibi.FlappyGame.HEIGHT - bird.getHeight()); 
       bird.setToDying(); 
       showWhiteScreen(); 
      } else if (pair.getRuby().getBounds().overlaps(bird.getBounds())) { 
       score++; 
       updateScoreLabel(); 
       pair.moveCoinOffscreen(); 
       com.pentagames.flappybibi.Assets.playBingSound(); 
      } 
     } 
    } 

    private void showWhiteScreen() { 
     whitePixel.setWidth(com.pentagames.flappybibi.FlappyGame.WIDTH); 
     whitePixel.setHeight(com.pentagames.flappybibi.FlappyGame.HEIGHT); 

     gameplayStage.addActor(whitePixel); 

     whitePixel.addAction(Actions.fadeOut(.5f)); 
    } 

    private void updateScoreLabel() { 
     scoreLabel.setText(String.valueOf(score)); 
     scoreLabel.setWidth(scoreLabel.getTextBounds().width); 
     scoreLabel.setPosition(com.pentagames.flappybibi.FlappyGame.WIDTH/2, com.pentagames.flappybibi.FlappyGame.HEIGHT * .9f, Align.center); 
    } 

    private void stopTheWorld() { 
     bird.setToDying(); 
     killPipePairs(); 
     stopTheGround(); 
     screenState = State.DYING; 

    } 

    private void stopTheGround() { 
     ground.vel.x = 0; 
    } 

    private void killPipePairs() { 
     for (PipePair pair : pipePairs) { 
      pair.getBottomPipe().setState(Pipe.State.dead); 
      pair.getTopPipe().setState(Pipe.State.dead); 
      pair.getRuby().setVel(0, 0); 
     } 
    } 

    private void updatePipePairs() { 
     for (int i = 0; i < pipePairs.size; i++) { 
      pipePairs.get(i).update(); 
     } 
    } 

    private void addPipes(Stage gameplayStage) { 
     for (int i = 0; i < pipePairs.size; i++) { 
      gameplayStage.addActor(pipePairs.get(i).getBottomPipe()); 
      gameplayStage.addActor(pipePairs.get(i).getTopPipe()); 
      gameplayStage.addActor(pipePairs.get(i).getRuby()); 
     } 
    } 

    private void initThirdSetOfPipes() { 
     Pipe topPipe = new Pipe(); 
     Pipe bottomPipe = new Pipe(); 
     topPipe.getRegion().flip(false, true); 
     PipePair pair = new PipePair(topPipe, bottomPipe); 
     pair.initThird(); 

     // add the pair to the list 
     pipePairs.add(pair); 
    } 

    private void initSecondSetOfPipes() { 
     Pipe topPipe = new Pipe(); 
     Pipe bottomPipe = new Pipe(); 
     topPipe.getRegion().flip(false, true); 
     PipePair pair = new PipePair(topPipe, bottomPipe); 
     pair.initSecond(); 

     // add the pair to the list 
     pipePairs.add(pair); 
    } 

    private void initFirstSetOfPipes() { 
     Pipe topPipe = new Pipe(); 
     Pipe bottomPipe = new Pipe(); 
     topPipe.getRegion().flip(false, true); 
     PipePair pair = new PipePair(topPipe, bottomPipe); 
     pair.initFirst(); 

     // add the pair to the list 
     pipePairs.add(pair); 
    } 

    /** 
    * Tells libgdx to listen for inputs coming from the InputAdapter we give it 
    */ 
    private void initInputProcessor() { 
     Gdx.input.setInputProcessor(new InputAdapter() { 
      // We only care about the touch down event 
      @Override 
      public boolean touchDown(int screenX, int screenY, int pointer, int button) { 

       switch (screenState) { 

        case DYING: 
         justTouched = true; 
         break; 

        case DEAD: 
         if (allowRestart) { 
          game.setScreen(new GameplayScreen(game)); 
         } 
         justTouched = true; 
         break; 

        case PLAYING: 
         justTouched = true; 
         break; 


        case PREGAME: 
         justTouched = true; 
         screenState = State.PLAYING; 
         bird.setState(Bird.State.ALIVE); 
         bird.clearActions(); 
         tapToFlap.addAction(Actions.moveToAligned(com.pentagames.flappybibi.FlappyGame.CENTER_X, com.pentagames.flappybibi.FlappyGame.HEIGHT, Align.bottom, .75f, Interpolation.sine)); 
         initFirstSetOfPipes(); 
         initSecondSetOfPipes(); 
         initThirdSetOfPipes(); 
         addPipes(gameplayStage); 
         gameplayStage.addActor(ground); 
         gameplayStage.addActor(bird); 
         break; 

       } 
       return true; 
      } 
     }); 
    } 


} 

這是我與LibGDX工作在第一時間,將如果你是偉大的可以向我解釋如何在此項目中實施插頁式廣告。

對不起,我的英語不好。

回答

1

您已經整合了橫幅廣告,因此無需在項目中注入相關的工件。

按照以下步驟進行插頁式廣告集成。

  1. AndroidManifest.xml

    讓插頁式廣告

    <activity android:name="com.google.android.gms.ads.AdActivity" 
          android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 
          android:theme="@android:style/Theme.Translucent" /> 
    
  2. 一個的AdActivity進入你的核心模塊中創建的接口

    public interface AdService { 
    
        boolean isInterstitialLoaded(); 
        void showInterstitial(); 
    } 
    
  3. 創建的帶參數的構造210類

    public AdService adService; 
    
    public FlappyGame(AdService ads){ 
        adService=ads; 
    } 
    
  4. 實現AdService界面,您​​類

    public class AndroidLauncher extends AndroidApplication implements AdService { 
    
        private static final String AD_UNIT_ID_INTERSTITIAL = "ca-app-pub-XXXXX/XXXXX"; 
        private InterstitialAd interstitialAd; 
    
        @Override 
        protected void onCreate (Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
    
         ... 
         View gameView=initializeForView(new FlappyGame(this), config); 
         ... 
    
         interstitialAd = new InterstitialAd(this); 
         interstitialAd.setAdUnitId(AD_UNIT_ID_INTERSTITIAL); 
         interstitialAd.setAdListener(new AdListener() { 
           @Override 
           public void onAdLoaded() {} 
    
           @Override 
           public void onAdClosed() { 
            loadIntersitialAd(); 
           } 
         }); 
    
         loadIntersitialAd(); 
        } 
    
        private void loadIntersitialAd(){ 
    
         AdRequest interstitialRequest = new AdRequest.Builder().build(); 
         interstitialAd.loadAd(interstitialRequest); 
        } 
    
        @Override 
        public void showInterstitial() { 
         runOnUiThread(new Runnable() { 
          public void run() { 
           if (interstitialAd.isLoaded()) 
            interstitialAd.show(); 
           else 
            loadIntersitialAd(); 
          } 
         }); 
        } 
    
        @Override 
        public boolean isInterstitialLoaded() { 
         return interstitialAd.isLoaded(); 
        } 
    } 
    
  5. GameScreen

    RunnableAction playWooshAction = Actions.run(new Runnable() { 
         @Override 
         public void run() { 
          com.pentagames.flappybibi.Assets.playWooshSound(); 
          game.adService.showInterstitial(); 
         } 
    }); 
    

我整合插頁式廣告在你的項目,創造了pull request 對於相同的。您可以合併我的拉取請求。

+1

工程就像一個魅力。非常感謝 :) –

相關問題