三、状态管理
2015-10-23 08:46
232 查看
接下来是我们该考虑什么时间该渲染哪个界面,整体游戏流程是怎么控制的问题了?我们要为每个游戏界面定义一个游戏状态类也就是需要为每个界面创建一个GameState类,然后通过一个管理类改变内部参数来控制这些GameState什么时间点、什么事件该渲染哪个GameState。因此我们首先创建一个GameStateManager的管理类,然后再此类中创建需要管理的GameState类,向每一个GameState类中传入GameStateManger对象,然后通过修改这个对象的参数实现界面的跳转。在第一节中我们已经说过游戏中我们共计创建4个状态界面,因此在我们的GameStateManager类中需要对应的定义四个GameState类,因这4个界面中都有一些共同的属性及方法,因此我们首先创建一个GameStateManager类之后创建一个界面的父类也就是GameState抽象类,然后让各个界面继承自他。管理如图1所示,现在来代码演示:
首先创建一个GameStateManager的空类,然后创建一个GameState抽象类,定义方法及变量如下:
实现以上代码后我们来完善GameStateManager类:
写到这里我们已经实现了这个可以控制整个游戏流程的管理类和游戏界面的父类,我们可以通过管理类来控制每个界面的跳转,同时每个界面只需要继承自这个GameState就可以了。
好的下一步让我们把这个管理类加入到整个游戏的主循环render方法里面,打开MyGdxGame类在类里定义一个成员变量:
最后在render方法内调用gsm的两个方法
至此就实现了这个状态管理的类,我们可以通过传入PLAY、MENU、HIGHSCORE、GAMEOVER四个参数来控制游戏的界面跳转(注意此时进行测试会出现空指针异常,因为我们到现在还未对任何一个状态界面进行实例化,因此测试一开始gsm跳转时会报出异常)。这节我们就实现到这里,管理流程可以参考图二。下一节中我们继续实现游戏状态界面。
首先创建一个GameStateManager的空类,然后创建一个GameState抽象类,定义方法及变量如下:
public abstract class GameState { protected GameStateManager gsm; protected GameState(GameStateManager gsm){ this.gsm=gsm; init(); } //构造函数这里让每一个界面都传入一个GameStateManger, //然后利用GameStateManger里的参数来管理界面的跳转 //每次实例化时都会调用init方法进行初始化参数 public abstract void init(); //初始化参数用 public abstract void update(float dt); //更新屏幕用方法 public abstract void draw(); //绘制渲染屏幕方法 public abstract void handleInput(); //输入事件操作方法 public abstract void dispose(); //释放内存方法 }
实现以上代码后我们来完善GameStateManager类:
public class GameStateManager { private GameState gamestate; //定义一个状态界面 public static final int MENU=1; public static final int PLAY=2; public static final int HIGHSCORE=3; public static final int GAMEOVER=4; //定义出每个界面的常量参数 public GameStateManager(){ setState(PLAY); //这里我们首先传进来playstate界面因为我们接下来要实现的将是这个界面 } public void setState(int state){ if(gamestate!=null)gamestate.dispose(); //每次跳转页面时都会调用上一个界面内的dispose方法进行内存释放 if(state==MENU){ //如果传过来的参数值与MENU相等则实例化gamestate对象为 //MenuState对象。 } if(state==PLAY){ //如果传过来的参数值与PLAY相等则实例化gamestate对象为 //PlayState对象。 } if(state==HIGHSCORE){ //如果传过来的参数值与HIGHSCORE相等则实例化gamestate对象为 //HighScoreState对象。 } if(state==GAMEOVER){ //如果传过来的参数值与GAMEOVER相等则实例化gamestate对象为 //GameOverState对象。 } } public void update(float dt){ gamestate.update(dt); //循环调用gamestate对象内的uodate方法 } public void draw(){ gamestate.draw(); //循环调用gamestate对象内的draw方法 } }
写到这里我们已经实现了这个可以控制整个游戏流程的管理类和游戏界面的父类,我们可以通过管理类来控制每个界面的跳转,同时每个界面只需要继承自这个GameState就可以了。
好的下一步让我们把这个管理类加入到整个游戏的主循环render方法里面,打开MyGdxGame类在类里定义一个成员变量:
private GameStateManager gsm;然后在create方法内实例化这个对象
gsm=new GameStateManager();
最后在render方法内调用gsm的两个方法
gsm.update(Gdx.graphics.getDeltaTime()); gsm.draw();
至此就实现了这个状态管理的类,我们可以通过传入PLAY、MENU、HIGHSCORE、GAMEOVER四个参数来控制游戏的界面跳转(注意此时进行测试会出现空指针异常,因为我们到现在还未对任何一个状态界面进行实例化,因此测试一开始gsm跳转时会报出异常)。这节我们就实现到这里,管理流程可以参考图二。下一节中我们继续实现游戏状态界面。
相关文章推荐
- 《CLR Via C#》学习--线程开销
- 变形--位移 translate()
- 第七周 队列数组
- 第八周-项目1 - 建立顺序串的算法库
- github分支管理
- 第四周:单链表的应用举例
- 字符串匹配--最大最小表示法模板
- POJ 1860——Currency Exchange——————【最短路、SPFA判正环】
- 1021. 个位数统计 (15)
- 第八周项目2-建立链串的算法库
- Android: LinearLayout布局和其嵌套运用举例
- github 远程仓库
- 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
- PHP开发环境思考
- 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
- 第八周 项目4-字符串加密
- 第七周项目4-队列数组
- 第七周项目4 - 队列数组
- 第七周 项目一 建立顺序环形算法库
- Sql 2005 维护笔记