在libgdx游戏中正确实现广告

时间:2017-02-03 02:20:07

标签: java android performance libgdx admob

我知道它很长,但我需要帮助。

我过去一个月一直在使用这个libgdx游戏工作(并且正在努力),一切都很顺利,但是当我在其中添加插页式广告时,它变得出乎意料地变得缓慢而且游戏很多故障......工作正常如果我删除广告代码

我的游戏是如何运作的,它来自MenuState>> PlayState>> GameOverState>> PlayState>> GameOverState等等...(所有代码都在下面给出)

我有几个问题 (a)如何让我的游戏顺利运作? (b)有没有办法只在GameOverState中显示广告?(我尝试在广告上引入布尔值和'if'语句但失败了) (c)我如何更有效地处置我的资产?(如果课程被反复调用太快,他们不会处置)

如果您需要更多相关信息,请告诉我,我很乐意这样做。

国:

主要的libgdx类:GrumpyDemo

package com.mygdx.game;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.utils.TimeUtils;
import com.mygdx.game.States.AdCloseState;
import com.mygdx.game.States.GameOverState;
import com.mygdx.game.States.GameStateManager;
import com.mygdx.game.States.MenuState;

public class GrumpyDemo extends ApplicationAdapter {
    public static final int WIDTH = 480;
    public static final int HEIGHT= 800;

public static final String TITLE = "Flappy Bird";
private GameStateManager gsm;
public static long AdStart = 0;
public AdController adController;


private SpriteBatch batch;

public GrumpyDemo(AdController adController){
    this.adController = adController;
}


@Override
public void create () {
    batch = new SpriteBatch();
    gsm = new GameStateManager();
    Gdx.gl.glClearColor(1, 0, 0, 1);
    gsm.push(new MenuState(gsm));
    AdStart = TimeUtils.nanoTime();
    adController.showBannerAds();
}

@Override
public void render () {

    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    gsm.update(Gdx.graphics.getDeltaTime());
    gsm.render(batch);
    if (TimeUtils.timeSinceMillis(AdStart)> 30000){
        adController.showInterstitialAds(new Runnable() {
            @Override
            public void run() {
                gsm.pop();
                gsm.push(new AdCloseState(gsm));
            }
        });

    }
}

@Override
public void dispose () {
    batch.dispose();



}
}

我的抽象类:状态

 package com.mygdx.game.States;

import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector3;

/**
 * Created by Kronos on 28-01-2017.
 */

public abstract class State {

    protected OrthographicCamera cam;
    protected Vector3 mouse;
    protected GameStateManager gsm;

    protected State(GameStateManager gsm){
        this.gsm = gsm;
        cam = new OrthographicCamera();
        mouse = new Vector3();


    }

    protected abstract void handleInput();
    public abstract void update(float dt);
    public abstract void render(SpriteBatch sb);
    public abstract void dispose();

MenuState:

 private Texture background;
private Texture playBtn;
private Music music;

public MenuState(GameStateManager gsm) {
    super(gsm);
    cam.setToOrtho(false, GrumpyDemo.WIDTH / 2, GrumpyDemo.HEIGHT / 2);
    background = new Texture("bg.png");
    playBtn = new Texture("playbtn.png");
    music = Gdx.audio.newMusic(Gdx.files.internal("mainmusic.mp3"));
    music.setVolume(0.8f);
    music.play();

}

@Override
public void handleInput() {
    if (Gdx.input.justTouched()) {
        gsm.set(new PlayState(gsm));

    }


}

@Override
public void update(float dt) {
    handleInput();

}

@Override
public void render(SpriteBatch sb) {
    sb.setProjectionMatrix(cam.combined);
    sb.begin();
    sb.draw(background, 0, 0);
    sb.draw(playBtn, cam.position.x - playBtn.getWidth() / 2, cam.position.y);
    sb.end();

}

@Override
public void dispose() {
    background.dispose();
    playBtn.dispose();
    music.dispose();
    System.out.println("Menu State Disposed");
}

PlayState:

package com.mygdx.game.States;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.TimeUtils;
import com.mygdx.game.GrumpyDemo;
import com.mygdx.game.Sprites.Bird;
import com.mygdx.game.Sprites.Tube;

/**
 * Created by Kronos on 28-01-2017.
 */

public class PlayState extends State {
    private static final int TUBE_SPACING = 75;
    private static final int TUBE_COUNT = 4;


    private Bird bird;
    private Texture actualGamebg;
    private Tube tube ;
    private Texture ground;
    private Vector2 groundPos1,groundPos2;
    private static final int HIGHEST_GROUND_LIMIT = -30;
    private Array<Tube> tubes;
    private int k;
    long startTime=0;
    private Music mainMusic;
    private Music scoreIncrease;
    private Music wingFlap;
    public BitmapFont font24;
    public String SCORE;
    public int l;
    public long gameOverStart=0;






    public PlayState(GameStateManager gsm) {
        super(gsm);
        bird = new Bird(0,300);
        actualGamebg = new Texture("bg.png");
        cam.setToOrtho(false, GrumpyDemo.WIDTH/2,GrumpyDemo.HEIGHT/2);

        tubes =new Array<Tube>();
        ground = new Texture("ground.png");
        mainMusic = Gdx.audio.newMusic(Gdx.files.internal("mainmusic.mp3"));
        scoreIncrease = Gdx.audio.newMusic(Gdx.files.internal("smw_coin.ogg"));
        wingFlap = Gdx.audio.newMusic(Gdx.files.internal("sfx_wing.ogg"));

        font24= new BitmapFont();
        SCORE = new String();
        fontGenerator();
        groundPos1 = new Vector2(cam.position.x -cam.viewportWidth/2, HIGHEST_GROUND_LIMIT);
        groundPos2 = new Vector2((cam.position.x - cam.viewportWidth/2) + ground.getWidth(),HIGHEST_GROUND_LIMIT);
        startTime = TimeUtils.nanoTime();
        gameOverStart = TimeUtils.millis();

        for(int i=1 ; i<=TUBE_COUNT; i++)
        {

            tubes.add(new Tube(i* (TUBE_SPACING + Tube.TUBE_WIDTH)));
        }
        mainMusic.play();
        mainMusic.setVolume(0.8f);
        mainMusic.setLooping(true);

    }

    @Override
    protected void handleInput() {
        if (Gdx.input.justTouched())
            bird.jump();
        wingFlap.setLooping(false);
        wingFlap.play();
        wingFlap.setVolume(0.1f);
    }




    @Override
    public void update(float dt) {
        handleInput();

        updateGround();

        bird.update(dt);
        if (TimeUtils.timeSinceNanos(startTime) > 1400000000)
        {
            Score();
            startTime = TimeUtils.nanoTime();
        }



        SCORE = String.valueOf(k);





        for(int i =0 ; i< tubes.size;i++)
        {
            Tube tube= tubes.get(i);

            if (cam.position.x - (cam.viewportWidth/2) > tube.getPosTopTube().x + tube.getTopTube().getWidth())
            {
                tube.reposition(tube.getPosTopTube().x + ((Tube.TUBE_WIDTH + TUBE_SPACING) *TUBE_COUNT));
            }
            if(tube.collides(bird.getBounds()))
            {

                    cam.position.x = bird.getPosition().x;
                    mainMusic.stop();

                    gsm.set(new GameOverState(gsm));
                    l = k;

            }

            else
                cam.position.x = bird.getPosition().x +80;

        }
        if (bird.getPosition().y <= ground.getHeight()){

            gsm.set(new GameOverState(gsm));
           mainMusic.stop();

            l = k;

        }




        cam.update();

    }



    @Override
    public void render(SpriteBatch sb) {

        sb.setProjectionMatrix(cam.combined);
        sb.begin();
        sb.draw(actualGamebg, cam.position.x - (cam.viewportWidth/2), 0);
        sb.draw(bird.getTexture(), bird.getPosition().x , bird.getPosition().y);
        for(Tube tube: tubes) {

            sb.draw(tube.getTopTube(), tube.getPosTopTube().x, tube.getPosTopTube().y);
            sb.draw(tube.getBottomTube(), tube.getPosBottomTube().x, tube.getPosBottomTube().y);
        }
        sb.draw(ground,groundPos1.x,groundPos1.y);
        sb.draw(ground,groundPos2.x,groundPos2.y);

        font24.draw(sb,SCORE,cam.position.x -2,cam.position.y + 15);
        sb.end();

    }

    /**
     * spritebatches must be drawn in order .The one at the bottommost acts as the top layer.
     */

    @Override
    public void dispose() {
        actualGamebg.dispose();
        bird.dispose();
        font24.dispose();
        for(Tube tube: tubes)
        {
            tube.dispose();
        }
        ground.dispose();
        mainMusic.dispose();
        scoreIncrease.dispose();
        wingFlap.dispose();


        System.out.println("Play State Disposed");

    }




    private void updateGround()
    {
        if (cam.position.x-(cam.viewportWidth/2) > groundPos1.x + ground.getWidth())
        {
            groundPos1.add(ground.getWidth()*2,0);
        }
        if (cam.position.x-(cam.viewportWidth/2) > groundPos2.x + ground.getWidth())
        {
            groundPos2.add(ground.getWidth()*2,0);
        }
    }


    public void Score()
    {
        k++;
        scoreIncrease.play();
        scoreIncrease.setVolume(0.3f);

    }
    public int getL(){
        return l;
    }


    public void fontGenerator(){
        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("bitmapfont/PressStart2P.ttf"));
        FreeTypeFontGenerator.FreeTypeFontParameter parameter= new FreeTypeFontGenerator.FreeTypeFontParameter();

        parameter.size=12;
        parameter.color= Color.GOLD;
        parameter.borderColor= Color.GOLDENROD;
        font24= generator.generateFont(parameter);
        font24.setUseIntegerPositions(false);
    }


    }

GameOverState:

 private Texture gameOver;
private Texture gameOverBg;
private Texture playAgainBtn;
private Texture ground;
private Vector2 groundPos1;
private Music gameOverMusic;
private BitmapFont totalScore;
private String STRING;
public PlayState playState;
public Boolean AdStart = true;




public GameOverState(GameStateManager gsm) {
    super(gsm);
    cam.setToOrtho(false, GrumpyDemo.WIDTH/2,GrumpyDemo.HEIGHT/2);

    gameOver = new Texture("gameover.png");
    gameOverBg =  new Texture ("bg.png");
    playAgainBtn = new Texture("playbtn.png");
    ground = new Texture("ground.png");
    AdStart = new Boolean(true);

    gameOverMusic = Gdx.audio.newMusic(Gdx.files.internal("gameoversfx.ogg"));
    groundPos1 = new Vector2(cam.position.x -cam.viewportWidth/2, -30);
    totalScore =  new BitmapFont();
    STRING = new String();
    playState = new PlayState(gsm);
    gameOverMusic.play();
    gameOverMusic.setVolume(1.0f);



}

@Override
public void handleInput() {
    if (Gdx.input.justTouched()) {

            gsm.set(new PlayState(gsm));
            gameOverMusic.stop();
            AdStart = false;

    }


}

@Override
public void update(float dt) {
    handleInput();
    STRING = "SCORE: " + playState.getL();
    fontGenerator();

}

@Override
public void render(SpriteBatch sb) {
    sb.setProjectionMatrix(cam.combined);
    sb.begin();
    sb.draw(gameOverBg,0,0);
    sb.draw(gameOver, cam.position.x-gameOver.getWidth()/2 , 5*(cam.position.y/3));
    sb.draw(ground,groundPos1.x,groundPos1.y);
    sb.draw(playAgainBtn,cam.position.x-playAgainBtn.getWidth()/2,2*(cam.position.y/3));
    totalScore.draw(sb,STRING,cam.position.x - gameOver.getWidth()/4 ,5*(cam.position.y/4));

    sb.end();


}

@Override
public void dispose() {
    gameOver.dispose();
    gameOverBg.dispose();
    playAgainBtn.dispose();
    ground.dispose();
    totalScore.dispose();
    playState.dispose();

    System.out.println("Game Over State Disposed");

}

public void fontGenerator(){
    FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("bitmapfont/PressStart2P.ttf"));
    FreeTypeFontGenerator.FreeTypeFontParameter parameter= new FreeTypeFontGenerator.FreeTypeFontParameter();

    parameter.size=12;
    parameter.color= Color.GOLD;
    parameter.borderColor= Color.GOLDENROD;
    totalScore= generator.generateFont(parameter);
    totalScore.setUseIntegerPositions(false);
}

public Boolean getAdStart(){
    return AdStart;
}

几乎忘记了......我的游戏状态经理:

  package com.mygdx.game.States;

import com.badlogic.gdx.graphics.g2d.SpriteBatch;

import java.util.Stack;

/**
 * Created by Kronos on 28-01-2017.
 */

public class GameStateManager {

    private Stack<State> states;
    public GameStateManager(){

        states = new Stack<State>();
    }


    public void push(State state)
    {
        states.push(state);
    }

    public void pop()
    {
        states.pop().dispose();
    }

    public void set(State state)
    {
        states.pop().dispose();
        states.push(state);
    }

    public void update(float dt)
    {
        states.peek().update(dt);
    }

    public void render(SpriteBatch sb)
    {
        states.peek().render(sb);
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

(a)可能是计时器/计数器滞后的原因,你也可以使用有效的广告。

(b)你在哪里使用你的GameOverState类的AdStart布尔值。只有当你的游戏通过界面移动到GameOverState时才调用有意的广告。

(c)创建您的所有资产一次并在不同的屏幕上使用它,在您退出游戏时处置所有资产 您的游戏处置方法是处理您所有资产的正确位置。 最好将AssetManager用于所有资产。