2017-09-25 4 views
0

première publication sur ce site. Je suis nouveau sur libGDX et java. J'ai une connaissance intermédiaire de C++. Mon problème est que mon code AdMob ne fonctionne que dans ma classe Android Launcher (je ne sais pas si c'est prévu ou si quelque chose me manque.) Je n'arrive pas à importer les bibliothèques dans d'autres classes. Code AndroidLauncher où je veux.libGDX/Code Android Studio AdMob dans les autres classes

Le jeu affiche actuellement une annonce à la bonne taille lorsque le jeu démarre. Je voudrais appeler l'annonce (il s'agit actuellement d'une bannière publicitaire, je veux éventuellement la changer en interstitielle, je comprends que les concepts sont quelque peu différents.) Quand my else if isGameOver() est utilisé (GameRenderer Class). Alors que quand le héros meurt, il affiche l'annonce. Je ne m'inquiéterai pas de le cacher quand le jeu redémarre, puisque l'utilisateur peut fermer l'éventuelle publicité interstitielle. Je comprends qu'il s'agit probablement plus d'un problème de logique et de manque de connaissances qu'un problème avec AdMob et libGDX. Mais j'ai fait beaucoup de recherches et je n'arrive pas à trouver des sources qui me semblent assez fonctionnelles. Si vous avez des ressources, ou si vous pouvez m'aider à comprendre mon problème, je l'apprécierais grandement. Si j'ai oublié de mettre toutes les informations dont vous avez besoin, n'hésitez pas à le demander. Je vais vérifier ce poste régulièrement.

Launcher 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(); 
} 

}

GameWorld:

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; 
} 

} 

Et c'est la partie de la classe GameRenderer pertinente.

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

Y at-il une raison quelconque vous n'êtes pas en utilisant une mise en page XML pour l'activité contenu? Cela faciliterait le déplacement de l'annonce entre les activités. –

Répondre

0

Vous ne pouvez pas accéder aux API Android à l'intérieur du module principal. Le module de base est une partie générique pour toutes les plateformes.

Par interfacing vous pouvez utiliser le code spécifique à la plate-forme d'accès.

Intégration de AdMob dans LibGDX Projets

+1

Merci beaucoup, cela a parfaitement fonctionné. Tu es incroyable. –

0

Dans LibGDX, le module de base est généralement séparé du module applications en tant que dépendance, de sorte que vous ne pouvez pas appeler directement les fonctions des modules applications à partir du module de base. Donc, la solution serait de créer une interface avec le nom AdLoader dans le module de base et d'ajouter des déclarations de fonction comme showAd() et hideAd().

Ensuite, faites en sorte que votre classe Android Launcher implémente l'interface et transmette-la en tant que constructeur dans la classe FinalDemo du module principal et enregistre la référence d'AdLoader, puis vous pouvez appeler les méthodes d'interface à partir du module principal.