android小游戏制作心得(一)——Activity的编写

版权所有。所有权利保留。

欢迎转载,转载时请注明出处:

http://blog.csdn.net/xiaofei_it


本人做过几个安卓小游戏,从游戏的制作过程中,总结了一些经验,现在跟大家分享一下。

这几篇博文想介绍一下安卓游戏的基本框架,这些框架在我制作游戏的过程中屡试不爽。

首先说一下游戏界面的制作。游戏制作很简单,一般不用xml文件,只需在游戏的Activity内放一个ImageView或者SurfaceView即可。但注意,这里不要直接添加ImageView或者SurfaceView,必须添加它们的子类。ImageView和SurfaceView类似,只是后者可以进行局部更新,更新速度比较快,前者则每次必须更新整个屏幕。现在手机速度比较快,个人认为对于小游戏,ImageView已经足够了,但有能力的话还是用SurfaceView,在本文的介绍中,都将使用SurfaceView。

以下是onCreate函数,这里就确定了界面。

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//去标题
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		//设置全屏
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
		//环境参数初始化
		Const.getInstance().init();
		gv=new GameView(this);
		setContentView(gv);
	}

去标题和设置全屏必须放在setContentView函数之前,否则会出现错误。

Const是一个保存参数的类,用设计模式Singleton实现。通常游戏很多常用参数都保存在这里,用户数据也可以在这里保存。

由于是Singleton,所以只会有一个实例。这个实例在构造的时候可以把用户数据读入。当用户数据变更时,也要进行相应的更新。

有时为了方便设计,可能需要多个ImageView或者SurfaceView叠加在一起,这时只需要在界面里放一个FrameLayout,然后把每个ImageView或者SurfaceView都铺进去即可。但要记住,通常情况下,我们会把每个ImageView或者SurfaceView铺满它的容器,即FrameLayout,所以只有最上面的那个View,也就是最后铺进去的那个View才会响应用户对屏幕的触摸事件。

这里也给出相应的onCreate函数。

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//去标题
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		//设置全屏
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
		//环境参数初始化
		Const.getInstance().init();
		FrameLayout frame=new FrameLayout(this);
		setContentView(frame);
		gv1=new GameView(this);
		frame.addView(gv1);
		gv2=new GameView(this);
		frame.addView(gv2);
		gv3=new GameView(this);
		frame.addView(gv3);
	} 
另外,在ImageView或者SurfaceView内要写上相应的resume和pause函数,然后在Activity的onResume和onPause函数里调用它们。这样在用户手机接电话等事件发生时游戏可以保存进度。对于SurfaceView,响应的操作可以放在surfaceCreated、surfaceDestroyed函数里。

	@Override
	public void onResume()
	{
		super.onResume();
		gv.resume();
	}
	@Override
	public void onPause()
	{
		super.onPause();
		gv.pause();
	}

另外,还要重写onKeyDown函数,在按下返回键的时候一定要调用View的pause函数,在恢复时调用resume函数。

这里使用了状态机,状态机给出当前游戏的状态,这个内容以后介绍。这个函数对于不同状态给出不同的处理方法。

下面给出一个Activity的实现。

public class Game extends Activity {
	private GameView gv;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//去标题
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		//设置全屏
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
		//环境参数初始化
		Const.getInstance().init();
		gv=new GameView(this);
		setContentView(frame);
	}
	@Override
	public void onResume()
	{
		super.onResume();
		gv.resume();
	}
	@Override
	public void onPause()
	{
		super.onPause();
		gv.pause();
	}
	@Override
	public boolean onKeyDown(int keyCode,KeyEvent event)
	{
		if(keyCode==KeyEvent.KEYCODE_BACK)
		{
			switch (StateMachine.getInstance().getCurrentState())
			{
			//当游戏处于欢迎界面时
			case welcome:
			//当游戏处于结果显示界面时
			case resultShow:
			//当游戏处于游戏进行界面时
			case gameMode:
			}
			return true;
		}
		else
			return super.onKeyDown(keyCode,event);
	}
}






你可能感兴趣的:(android开发,Android开发)