您的位置:首页 > 移动开发 > Android开发

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

2013-09-10 23:37 387 查看
版权所有。所有权利保留。

欢迎转载,转载时请注明出处:
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息