运行5分钟后,我的libgdx游戏崩溃并变为红色

时间:2014-06-26 21:37:48

标签: android libgdx

public class PlayScreen implements Screen{

    Stage stage;

    LabelStyle style;
    BitmapFont font;

    TextureAtlas backbuttonatlas;
    TextButtonStyle backbuttonstyle;
    TextButton backbutton;
    Skin backskin;

    SpriteBatch batch;
    Texture pibe;
    Sprite sprite;
    Vector2 position;
    Game game;

    Texture texture;

    public PlayScreen(Game game){
        this.game=game;
    }

    @Override
    public void render(float delta) {

    stage=new Stage();

    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


    if(Gdx.input.isKeyPressed(Keys.W))
    {
        position.x+=5f;
    }
    if(Gdx.input.isKeyPressed(Keys.A))
    {
        position.y-=5f;
    }
    if(Gdx.input.isKeyPressed(Keys.S))
    {
        position.x-=5f;
    }
    if(Gdx.input.isKeyPressed(Keys.D))
    {
        position.y+=5f;
    }

    if(Gdx.input.isTouched()==true)
    {
        if(Gdx.input.getY()>Gdx.graphics.getHeight()/2)
        {
        position.x-=5;
        }
        if(Gdx.input.getY()<Gdx.graphics.getHeight()/2)
        {
            position.x+=5;
        }
        if(Gdx.input.getX()>Gdx.graphics.getWidth()/2)
        {
            position.y+=5;
        }
        if(Gdx.input.getX()<Gdx.graphics.getWidth()/2)
        {
            position.y-=5;
        }

        if(Gdx.input.isKeyPressed(Keys.BACK))
        {
            game.setScreen(new MainMenu(game));
        }
    }

    font = new BitmapFont(Gdx.files.internal("font.fnt"), false);
    style = new LabelStyle(font, Color.WHITE);

    backskin = new Skin();
    backbuttonatlas = new TextureAtlas("buttons/backbutton.pack");
    backskin.addRegions(backbuttonatlas);

    backbuttonstyle = new TextButtonStyle();
    backbuttonstyle.up = backskin.getDrawable("backbutton");
    backbuttonstyle.over = backskin.getDrawable("backbuttonpressed");
    backbuttonstyle.down = backskin.getDrawable("backbuttonpressed");
    backbuttonstyle.font = font;

    backbutton = new TextButton("", backbuttonstyle);
    backbutton.setWidth((float) (Gdx.graphics.getHeight()/8));
    backbutton.setHeight((float) (Gdx.graphics.getHeight()/8));
    backbutton.setPosition((Gdx.graphics.getWidth()/20), (float) (Gdx.graphics.getHeight()-(Gdx.graphics.getWidth()/8)));

    backbutton.addListener(new InputListener(){

        public boolean touchDown(InputEvent event, float x, float y, int pointer, int backbutton) {
                game.setScreen(new MainMenu(game));
            return true;
        };});

    batch=new SpriteBatch();

    stage.addActor(backbutton);

    Gdx.input.setInputProcessor(stage);

    batch.begin();
    batch.draw(texture, 0, 0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
    batch.draw(pibe,(position.y/2-pibe.getWidth()/2),(position.x/2-pibe.getHeight()/2));
    batch.end();

    stage.act();
    stage.draw();

    }

    @Override
    public void resize(int width, int height) {
        // TODO Auto-generated method stub
    }

    @Override
    public void show() {
        texture = new Texture("cielo.png");

        pibe = new Texture("superman (100x52).jpg");
        position = new Vector2(Gdx.graphics.getHeight(),Gdx.graphics.getWidth());
    }

    @Override
    public void hide() {
        // TODO Auto-generated method stub
    }

    @Override
    public void pause() {
        // TODO Auto-generated method stub
    }

    @Override
    public void resume() {
        // TODO Auto-generated method stub
    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub
    }
}
  

我的LibGDX游戏,几分钟后崩溃,我不知道为什么。我已经阅读了一些关于这个问题的内容,并且它说解决方案是&#34; dispose&#34; bitmapfont,或类似的东西。我是LibGDX的新手,我不太了解。完整的解释表示赞赏。抱歉我的英语不好。   这是Play Class。请,需要帮助。感谢。

2 个答案:

答案 0 :(得分:4)

你必须把你的&#34;创造&#34;像<{1}}里面的东西

@覆盖     public void create(){

您创建了数十亿个SpriteBatches,导致内存问题。

答案 1 :(得分:1)

每次设备准备好更新屏幕时都会调用渲染。您正在每帧创建新对象。其中一些必须手动处理,这意味着调用该对象的.dispose()方法。

呼叫

font.dispose(); 

当你完成字体以防止它占用所有内存。

理想情况下,您希望在渲染循环之外创建该字体。

您应该在构造函数中创建对象,以便不会在每个帧中重新创建它们。当然,除非是预期的行为。

尝试这样的事情

public class PlayScreen implements Screen{

    Stage stage;

    LabelStyle style;
    BitmapFont font;

    TextureAtlas backbuttonatlas;
    TextButtonStyle backbuttonstyle;
    TextButton backbutton;
    Skin backskin;

    SpriteBatch batch;
    Texture pibe;
    Sprite sprite;
    Vector2 position;
    Game game;

    Texture texture;

    public PlayScreen(Game game){
        this.game=game;
        font = new BitmapFont(Gdx.files.internal("font.fnt"), false);
        style = new LabelStyle(font, Color.WHITE);
        stage=new Stage();
        backskin = new Skin();
        backbuttonatlas = new TextureAtlas("buttons/backbutton.pack");
        backskin.addRegions(backbuttonatlas);

        backbuttonstyle = new TextButtonStyle();
        backbuttonstyle.up = backskin.getDrawable("backbutton");
        backbuttonstyle.over = backskin.getDrawable("backbuttonpressed");
        backbuttonstyle.down = backskin.getDrawable("backbuttonpressed");
        backbuttonstyle.font = font;

        backbutton = new TextButton("", backbuttonstyle);
        backbutton.setWidth((float) (Gdx.graphics.getHeight()/8));
        backbutton.setHeight((float) (Gdx.graphics.getHeight()/8));
        backbutton.setPosition((Gdx.graphics.getWidth()/20), (float) (Gdx.graphics.getHeight()-(Gdx.graphics.getWidth()/8)));

        backbutton.addListener(new InputListener(){

            public boolean touchDown(InputEvent event, float x, float y, int pointer, int backbutton) {
                    game.setScreen(new MainMenu(game));
                return true;
            };});

        batch=new SpriteBatch();

        stage.addActor(backbutton);

    }

    @Override
    public void render(float delta) {


        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


        if(Gdx.input.isKeyPressed(Keys.W))
        {
            position.x+=5f;
        }
        if(Gdx.input.isKeyPressed(Keys.A))
        {
            position.y-=5f;
        }
        if(Gdx.input.isKeyPressed(Keys.S))
        {
            position.x-=5f;
        }
        if(Gdx.input.isKeyPressed(Keys.D))
        {
            position.y+=5f;
        }

        if(Gdx.input.isTouched()==true)
        {
            if(Gdx.input.getY()>Gdx.graphics.getHeight()/2)
            {
            position.x-=5;
            }
            if(Gdx.input.getY()<Gdx.graphics.getHeight()/2)
            {
                position.x+=5;
            }
            if(Gdx.input.getX()>Gdx.graphics.getWidth()/2)
            {
                position.y+=5;
            }
            if(Gdx.input.getX()<Gdx.graphics.getWidth()/2)
            {
                position.y-=5;
            }

            if(Gdx.input.isKeyPressed(Keys.BACK))
            {
                game.setScreen(new MainMenu(game));
            }
        }

        Gdx.input.setInputProcessor(stage);

        batch.begin();
        batch.draw(texture, 0, 0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
        batch.draw(pibe,(position.y/2-pibe.getWidth()/2),(position.x/2-pibe.getHeight()/2));
        batch.end();

        stage.act();
        stage.draw();

    }

    @Override
    public void resize(int width, int height) {
        // TODO Auto-generated method stub
    }

    @Override
    public void show() {
        texture = new Texture("cielo.png");

        pibe = new Texture("superman (100x52).jpg");
        position = new Vector2(Gdx.graphics.getHeight(),Gdx.graphics.getWidth());
    }

    @Override
    public void hide() {
        // TODO Auto-generated method stub
    }

    @Override
    public void pause() {
        // TODO Auto-generated method stub
    }