你的位置:首页 > 操作系统

[操作系统]libGDX游戏的生命周期


一,ApplicationListener和ApplicationAdapter

提及到libGDX的游戏生命周期,那么不得不提一个非常重要的接口ApplicationListener,这个接口位于com.badlogic.gdx包里,ApplicationListener的主要职责是创建和显示窗口。下图为ApplicationListener里的函数:

2015-07-20_235942

既然ApplicationListener是接口,那么就一定是需要去实现才能使用了,但是每次使用都要去实现这么多个方法,似乎有点吃力不讨好,而且好未必都用得上。看回之前创建的项目原来ApplicationListener已经有个实现的类ApplicationAdapter了:

2015-07-21_001133

二,生命周期图

看到了ApplicationListener里的这些函数,虽然都有一句话的解释,但是我觉得对照官方的生命周期图来看会更加清晰明了,以下是官方的生命周期图:

2015-07-21_000404

三,程序中看生命周期

为了清楚了解游戏的生命周期,下面我们使用log来打印下日志:

1,在core 中的主类中重写父类ApplicationAdapter的方法:

package com.stephen.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;public class MyGdxGame extends ApplicationAdapter {  SpriteBatch batch;  Texture img;    @Override  public void create () {    batch = new SpriteBatch();    img = new Texture("badlogic.jpg");  }  @Override  public void render () {    Gdx.gl.glClearColor(1, 0, 0, 1);    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);    batch.begin();    batch.draw(img, 0, 0);    batch.end();  }  @Override  public void resize(int width, int height) {    // TODO Auto-generated method stub    super.resize(width, height);  }  @Override  public void pause() {    // TODO Auto-generated method stub    super.pause();  }  @Override  public void resume() {    // TODO Auto-generated method stub    super.resume();  }  @Override  public void dispose() {    // TODO Auto-generated method stub    super.dispose();  }}

2,添加打印日志的语句:

package com.stephen.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;public class MyGdxGame extends ApplicationAdapter {  SpriteBatch batch;  Texture img;  private String tag = "TAG";  private boolean isRender = false;    @Override  public void create () {    Gdx.app.log(tag, "create");    batch = new SpriteBatch();    img = new Texture("badlogic.jpg");  }  @Override  public void render () {    if(!isRender){      //此处由于render会不断执行,所以加上个标志      Gdx.app.log(tag, "render");      isRender = true;    }        Gdx.gl.glClearColor(1, 0, 0, 1);    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);    batch.begin();    batch.draw(img, 0, 0);    batch.end();  }  @Override  public void resize(int width, int height) {    // TODO Auto-generated method stub    super.resize(width, height);    Gdx.app.log(tag, "resize");  }  @Override  public void pause() {    // TODO Auto-generated method stub    super.pause();    Gdx.app.log(tag, "pause");  }  @Override  public void resume() {    // TODO Auto-generated method stub    super.resume();    Gdx.app.log(tag, "resume");  }  @Override  public void dispose() {    // TODO Auto-generated method stub    super.dispose();    Gdx.app.log(tag, "dispose");  }}

3,运行程序,查看日志:

(1)游戏启动时:

2015-07-21_005253

(2)按Home键:

2015-07-21_005751

(3)按Home键后点击游戏图标:

2015-07-21_010013

(4)按返回键:

2015-07-21_005437

(5)再次回到游戏:

2015-07-21_005620

(6)从任务管理处直接关闭游戏:

2015-07-21_010246

四,总结

通过以上官方api的说明、官方的生命周期图和我们程序所打印的日志,可以总结如下:

create ():游戏首次创建时调用,在这个函数里可以初始化我们自己的一些信息。

resize():当create方法执行完毕后调用,另外当游戏处于活跃状态下屏幕尺寸改变时也会调用调用。

render ():这个函数在resize执行完毕后开始运行,而且是不断运行渲染游戏图像界面。

pause():游戏进入后台的时候调用,此时游戏处于非活跃状态,但是游戏还存在。

resume():游戏从非活跃状态到活跃状态时调用。

dispose():游戏被销毁时调用。