2017-02-03 20 views
-4

Я ЗНАЮ ЕГО ДОЛГО, НО НУЖЕН ПОМОЩЬ ПОЖАЛУЙСТА.Правильно использует рекламу в игре libgdx

Я работаю (и борется) с этой игрой libgdx в течение последнего месяца, и все прошло отлично, но когда я добавил в нее межстраничное объявление, он стал неожиданно медленным, и игра много глюков. Хорошо, если я удалить код с объявлениями

Как работает моя игра это идет от MenuState >> PlayState >> GameOverState >> PlayState >> GameOverState и так далее .. (все коды приведено ниже)

У меня есть пара вопросов (a) Как я могу заставить свою игру работать плавно? (b) Можно ли показывать рекламу только в GameOverState? (Я попытался ввести логическое выражение и выражение «если» в объявлении, но не удалось) (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; 
} 

Почти забыл it..My игра государственный менеджер:

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

(a) Может быть таймер/счетчик является причиной отставания, вы также можете использовать интересное объявление без него.

(b) где вы используете AdStart Boolean вашего класса GameOverState.Call интересное объявление, только когда ваша игра переходит в GameOverState с помощью интерфейса.

(c) создать все свои активы один раз и использовать его на другом экране, распоряжаться всеми активами при выходе из игры.
Способ утилизации вашей игры - это подходящее место для размещения всех ваших активов. Лучше использовать AssetManager для всех ваших активов.