gpt4 book ai didi

java - 如何在 LibGDX 项目中显示插屏广告?

转载 作者:行者123 更新时间:2023-11-29 07:29:43 24 4
gpt4 key购买 nike

找了一个Flappy Bird的GitHub项目,稍微改了一下。我成功实现了 AdMob 横幅广告。

但现在我还想要一个在游戏结束时弹出的插页式广告(当然不是每次)所以这是我的 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,如果你能解释一下如何在这个项目中实现插页式广告,那就太好了。

抱歉我的英语不好。

最佳答案

您已经集成了横幅广告,因此无需在您的项目中注入(inject)依赖 Artifact 。

按照这些步骤进行插页式广告集成。

  1. AndroidManifest.xml

    为插页式广告创建一个AdActivity条目

    <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. 在核心模块中创建一个接口(interface)

    public interface AdService {

    boolean isInterstitialLoaded();
    void showInterstitial();
    }
  3. 创建FlappyGame 类的参数化构造函数

    public AdService adService;

    public FlappyGame(AdService ads){
    adService=ads;
    }
  4. 为您的 AndroidLauncher 类实现 AdService 接口(interface)

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

我在您的项目中集成了 Interstitial Ad,创建了一个 pull request对于相同的。您可以合并我的拉取请求。

关于java - 如何在 LibGDX 项目中显示插屏广告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44650048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com