libGDX/Android Studio将AdMob代码嵌入其他类

问题描述:

首次发布到此网站。我是libGDX和java的新手。我有一个C++的中级知识。我的问题是,我的AdMob代码只适用于我的Android启动器类(不知道这是有意的还是我错过了某些东西,我似乎无法将这些库导入其他类)然后,我无法使用AndroidLauncher代码,我想要的地方。libGDX/Android Studio将AdMob代码嵌入其他类

游戏目前在游戏启动时以正确的尺寸显示广告。我想调用这个广告(它现在是一个横幅广告,我最终希望将其更改为插页式广告,我理解这些概念有些不同。)当我使用isGameOver()时,我会使用它(GameRenderer类)。所以当英雄死亡时,它会显示广告。我不担心在游戏重新启动时隐藏它,因为用户可以自行关闭最终的插页式广告。我知道这可能更像是一个逻辑和缺乏知识问题,而不是AdMob和libGDX的问题。但是我已经研究了一个很好的数量,似乎无法找到任何对我来说足够合理的来源。如果您有任何资源,或者您可以帮助我理解我的问题,我将不胜感激。如果我忘记提供您需要的任何信息,请随时索要。我会定期检查这个帖子。

Android启动:

package com.wearnoble.game; 

import android.os.Bundle; 
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.AdRequest; 
import com.google.android.gms.ads.AdSize; 
import com.google.android.gms.ads.AdView; 
import com.google.android.gms.ads.InterstitialAd; 

public class AndroidLauncher extends AndroidApplication { 
private InterstitialAd mInterstitialAd; 

private static final String adUnitId="ca-app-pub- 
XXXXXXXXXXXXXXXXXXXX"; 
private AdView adView; 
InterstitialAd interstitialAd; 

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

    RelativeLayout layout = new RelativeLayout(this); 
    RelativeLayout.LayoutParams params = new 
RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 
RelativeLayout.LayoutParams.MATCH_PARENT); 
    layout.setLayoutParams(params); 

    View gameView=initializeForView(new FinalDemo(), config); 

    RelativeLayout.LayoutParams gameViewParams = new 
RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 
RelativeLayout.LayoutParams.WRAP_CONTENT); 
    gameViewParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); 
    gameViewParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); 

    gameView.setLayoutParams(gameViewParams); 
    layout.addView(gameView); 

    adView = new AdView(this); 
    adView.setAdSize(AdSize.BANNER); 
    adView.setAdUnitId(adUnitId); 

    AdRequest.Builder adRequestBuilder = new AdRequest.Builder(); 
    adRequestBuilder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR); 
    adView.loadAd(adRequestBuilder.build()); 

    RelativeLayout.LayoutParams topParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    topParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE); 
    topParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); 
    layout.addView(adView, topParams); 
    adView.setBackgroundColor(android.graphics.Color.TRANSPARENT); 

    setContentView(layout); 

    mInterstitialAd = new InterstitialAd(this); 
    mInterstitialAd.setAdUnitId("ca-app-pub-4578173480768480/4050414865"); 
    mInterstitialAd.loadAd(new AdRequest.Builder().build()); 








} 

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

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

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

}

游戏世界:

public class GameWorld { 
public int score=0; 
private float runTime=0; 
private GameState currentState; 
private Hero hero; 
private ScrollHandler scroller; 
private Rectangle ground; 
private int midPointY; 
private GameRenderer renderer; 



public enum GameState { 

    MENU, READY, RUNNING, GAMEOVER, HIGHSCORE 

} 
public GameWorld(int midPointY){ 
    currentState=GameState.MENU; 
    this.midPointY=midPointY; 
    hero=new Hero(33,midPointY-5,17,12); 
    scroller = new ScrollHandler(this, midPointY + 66); 
    ground=new Rectangle(0, midPointY + 66, 137, 11); 


} 
public void update(float delta) { 
    runTime += delta; 

    switch (currentState) { 
     case READY: 
     case MENU: 
      updateReady(delta); 
      break; 

     case RUNNING: 
      updateRunning(delta); 
      break; 
     default: 
      break; 
    }} 
private void updateReady(float delta) { 
    hero.updateReady(runTime); 
    scroller.updateReady(delta); 

} 


public void updateRunning(float delta){ 
    // Add a delta cap so that if our game takes too long 
    // to update, we will not break our collision detection. 
    if (delta > .15f) { 
     delta = .15f; 
    } 
    hero.update(delta); 
    scroller.update(delta); 

    if (scroller.collides(hero)&&hero.isAlive()) { 
     // Clean up on game over 
     scroller.stop(); 
     hero.die(); 
     renderer.prepareTransition(255,255,255,.3f); 

     //AssetLoader.dead.play(); 
    } 
    //if (scroller.collides(hero) && hero.isAlive()) { 
     // scroller.stop(); 
     // hero.die(); 
     // AssetLoader.dead.play(); 

    if (Intersector.overlaps(hero.getBoundingCircle(), ground)) { 
     if (hero.isAlive()){ 
      //AssetLoader.dead.play(); 
      renderer.prepareTransition(255,255,255,.3f); 
      hero.die(); 
     } 
     scroller.stop(); 
     hero.decelerate(); 
     currentState = GameState.GAMEOVER; 

     if (score > AssetLoader.getHighScore()) { 
      AssetLoader.setHighScore(score); 
      currentState = GameState.HIGHSCORE; 
     } 



}} 


public boolean isHighScore() { 
return currentState == GameState.HIGHSCORE; 
} 
public boolean isReady() { 
    return currentState == GameState.READY;} 
public void start() { 
    currentState = GameState.RUNNING; 
} 
public void restart(){ 
score = 0; 
hero.onRestart(midPointY - 5); 
scroller.onRestart(); 
ready(); 
} 
public boolean isGameOver() { 
    return currentState == GameState.GAMEOVER; 
} 
public Hero getHero(){ 
    return hero; 
} 
public ScrollHandler getScroller(){ 
    return scroller; 
} 
public int getScore(){ 
    return score; 
} 
public void addScore(int increment) { 
    score += increment; 
} 
public int getMidPointY(){ 
return midPointY; 
} 
public void ready() { 
    currentState = GameState.READY; 
    renderer.prepareTransition(0,0,0,1f); 
} 
public boolean isMenu() { 
    return currentState == GameState.MENU; 
} 
public boolean isRunning() { 
    return currentState == GameState.RUNNING; 
} 
public void setRenderer(GameRenderer renderer){ 
    this.renderer = renderer; 
} 

} 

这是从GameRenderer类是相关的部分。

if (myWorld.isRunning()) { 
     drawHero(runTime); 
     drawScore(); 
    } else if (myWorld.isReady()) { 
     drawHero(runTime); 
     drawScore(); 
    } else if (myWorld.isMenu()) { 
     drawHeroCentered(runTime); 
     drawMenuUI(); 
    } else if (myWorld.isGameOver()) { 
     drawScoreboard(); 
     drawHero(runTime); 
     drawGameOver(); 
     drawRetry(); 
    } else if (myWorld.isHighScore()) { 
     drawScoreboard(); 
     drawHero(runTime); 
     drawHighScore(); 
     drawRetry(); 
    } 
+0

有没有你不使用的XML布局为活动的任何原因内容?这样可以更轻松地在活动之间移动广告。 –

您无法访问核心模块内的Android API。核心模块是所有平台的通用部分。

通过interfacing您可以使用访问平台特定的代码。

AdMob广告在LibGDX的集成项目

+1

非常感谢你,这很好。你太棒了。 –

在LibGDX中,核心模块通常与Android模块分离为依赖项,所以不能直接从核心模块调用Android模块的功能。

所以解决方法是在核心模块中创建名称为AdLoader的接口并添加函数声明,如showAd()hideAd()

然后让您的类Android Launcher实现该接口并将其作为构造函数传递给FinalDemo类的核心模块并保存AdLoader的引用,然后您可以从核心模块调用接口方法。