三、状态管理

接下来是我们该考虑什么时间该渲染哪个界面,整体游戏流程是怎么控制的问题了?我们要为每个游戏界面定义一个游戏状态类也就是需要为每个界面创建一个GameState类,然后通过一个管理类改变内部参数来控制这些GameState什么时间点、什么事件该渲染哪个GameState。因此我们首先创建一个GameStateManager的管理类,然后再此类中创建需要管理的GameState类,向每一个GameState类中传入GameStateManger对象,然后通过修改这个对象的参数实现界面的跳转。在第一节中我们已经说过游戏中我们共计创建4个状态界面,因此在我们的GameStateManager类中需要对应的定义四个GameState类,因这4个界面中都有一些共同的属性及方法,因此我们首先创建一个GameStateManager类之后创建一个界面的父类也就是GameState抽象类,然后让各个界面继承自他。管理如图1所示,现在来代码演示:


首先创建一个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 跳转时会报出异常)。这节我们就实现到这里,管理流程可以参考图二。下一节中我们继续实现游戏状态界面。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉林南瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值