【问题标题】:libGDX/Android Studio AdMob code into other classeslibGDX/Android Studio AdMob 代码到其他类
【发布时间】:2017-09-25 01:27:43
【问题描述】:

第一次在这个网站上发帖。我是 libGDX 和 java 的新手。我有 c++ 的中级知识。我的问题是我的 AdMob 代码仅适用于我的 Android Launcher 类(不确定这是有意的还是我遗漏了什么。我似乎无法将库导入其他类)然后我在使用我想要的 AndroidLauncher 代码。

游戏当前在游戏启动时以正确的尺寸显示广告。当我的 else if 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();
    }

【问题讨论】:

  • 您是否有任何理由不对活动内容使用 XML 布局?这样可以更轻松地在活动之间移动广告视图。

标签: java android libgdx admob


【解决方案1】:

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

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

在 LibGDX 项目中集成 AdMob 广告

【讨论】:

  • 非常感谢,这非常有效。你太棒了。
【解决方案2】:

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

因此解决方案是在核心模块中创建一个名称为AdLoader 的接口,并添加像showAd()hideAd() 这样的函数声明。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多