6.4 主控制类——TXZActivity类的开发
Android 3D 游戏案例开发大全
Android程序中,Activity是最重要的类之一。在本游戏中,TXZActivity继承自Activity类,为本游戏的主控制类,本节将具体介绍TXZActivity的开发,其具体步骤如下。
(1)主控制类代码非常多,首先搭建主控制类的框架,以帮助读者理解,主控制类框架代码如下。
1 package com.bn.txz; //声明包
2 ……//此处省略了本类中导入类的代码,读者可以自行查阅随书光盘中的源代码
3 public class TXZActivity extends Activity {
4 TXZGameSurfaceView gv; //游戏View引用
5 public SharedPreferencesUtil sharedUtil; //声明SharedPreferencesUtil引用
6 AudioManager audio; //游戏中控制音量工具对象
7 public MediaPlayer beijingyinyue; //播放器
8 public SharedPreferences sp; //声明SharedPreferences引用
9 public boolean yinXiao=true; //是否播放游戏音效标志位
10 @Override
11 public void onCreate(Bundle savedInstanceState) {
12 super.onCreate(savedInstanceState);
13 requestWindowFeature(Window.FEATURE_NO_TITLE);
14 //设置为全屏显示
15 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,
16 WindowManager.LayoutParams.FLAG_FULLSCREEN);
17 //设置为横屏模式
18 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
19 DisplayMetrics dm=new DisplayMetrics();
20 getWindowManager().getDefaultDisplay().getMetrics(dm);
21 Constant.screenWidth=dm.widthPixels; //获取屏幕横向分辨率
22 Constant.screenHeight=dm.heightPixels;
23 Constant.ScaleSR(); //调用Constant类中计算缩放比例的方法
24 Constant.ratio=screenWidthStandard/screenHeightStandard; //宽、高、比
25 sp= this.getSharedPreferences("sysz", Context.MODE_PRIVATE); //SharedPreferences对象
26 yinXiao=sp.getBoolean("youxiyinxiao", true); //获得boolean值yinXiao
27 //初始化SharedPreferencesUtil对象
28 sharedUtil=new SharedPreferencesUtil(TXZActivity.this);
29 sharedUtil.getPassNum(); //设置了初始的关卡数
30 new Thread(){ //加载的线程
31 public void run(){
32 synchronized(Constant.initLock) {
33 //加载图片数据进内存
34 PicDataManager.loadPicData(TXZActivity.this);
35 //加载物体顶点位置、纹理坐标数据进内存缓冲
36 VertexDataManager.initVertexData(TXZActivity.this.getResources());
37 SoundUtil.initSounds(TXZActivity.this); //加载游戏音效
38 }} }.start();
39 gotoWelcomeView(); //到欢迎界面
40 }
41 ……//此处省略了本类中消息处理Handler代码,将在下面介绍
42 ……//此处省略了跳转到游戏中部分界面的方法,将在下面进行介绍
43 ……//此处省略了显示对话框的方法,读者可自行查阅随书光盘中源代码
44 ……//此处省略了本类中按键监听方法,将在下面进行介绍
45 ……//此处省略了本类中播放背景音乐方法,将在下面进行介绍
46 ……//此处省略了本类中停止播放背景音乐方法,将在下面进行介绍
47 ……//此处省略了重写的onResume与onPause方法,读者可以自行查阅随书光盘中的源代码
48 }
第13-18行是设置屏幕的显示模式,设置为全屏、横屏模式。第19-22行为根据设备的具体参数获取屏幕分辨率及宽高比,并记录下来,使游戏的界面符合设置的横屏模式。
第30-38行是图片、物体的顶点位置及纹理坐标和游戏音效的加载,初始化游戏资源。第39行为进入欢迎界面。
(2)游戏中部分界面的跳转和信息的显示依靠消息传递机制。在Activity中的消息接收者通过接收的消息编号执行相应的操作,来实现界面跳转及信息显示的功能,其代码如下。
1 public Handler handler = new Handler(){ //接收消息的handler
2 @Override
3 public void handleMessage(Message msg) {
4 super.handleMessage(msg);
5 switch (msg.what) {
6 case COMMAND_GOTO_GAME_VIEW: //返回游戏界面
7 gotoGameView();
8 break;
9 case COMMAND_GOTO_MENU_VIEW: //返回菜单界面
10 gotoMenuView();
11 break;
12 case COMMAND_GOTO_GUAN_VIEW: //返回选关界面
13 gotoSelectView();
14 break;
15 case COMMAND_GOTO_SET_VIEW: //返回设置界面
16 gotoSetView();
17 break;
18 }}
19 };
第1-3行为初始化Handler并重写handleMessage方法,接收传来的消息。第5-17行为根据收到的消息进行判断,跳转到不同的界面。
(3)由于本类的跳转界面比较多,不可能对所用的界面跳转进行一一介绍,所以,这里只介绍部分具有代表性的界面跳转代码的开发,其代码如下。
1 public void gotoWelcomeView(){ //返回欢迎界面去的方法
2 TXZWelcomeView wv=new TXZWelcomeView(this);
3 setContentView(wv); //返回欢迎界面
4 }
5 public void gotoMenuView(){ //返回菜单界面去的方法
6 TXZMenuView mv=new TXZMenuView(this);
7 setContentView(mv); //返回菜单界面
8 currView=WhichView.MENU_VIEW; //更新当前View到菜单View
9 if(IS_BEIJINGYINYUE) { //如果IS_BEIJINGYINYUE为true,则播放背景音乐
10 if(beijingyinyue==null) {
11 playBeiJingYinYue(); //调用播放背景音乐的方法
12 }}
13 }
14 public void gotoGameView( { //返回游戏界面去的方法
15 synchronized(Constant.initLock) {
16 gv=new TXZGameSurfaceView(this);
17 setContentView(gv); //返回游戏界面
18 gv.requestFocus(); //获取焦点
19 gv.setFocusableInTouchMode(true); //设置为可触控
20 currView=WhichView.GAME_VIEW; //更新当前View到游戏View
21 }}
第1-4行是返回欢迎界面去的方法。第5-13行为返回菜单界面的方法,在方法中主要是创建界面的对象,并调用setContentView方法跳转到菜单界面,同时根据是否播放背景音乐的标志位进行背景音乐的播放。
第14-21行是返回游戏界面的方法,在方法中主要是创建界面的对象,并调用setContentView 方法跳转到菜单界面,同时设置为可触控。
(4)接下来开发onKeyDown方法,该方法为继承Activity后重写的方法,实现对手机按键的监听,玩家单击后做出相应的处理,其代码如下。
1 @Override
2 public boolean onKeyDown(int keyCode, KeyEvent event) { //监听返回键方法
3 if(keyCode!=4) { //如果不是返回键则不做处理
4 return false;
5 }
6 if(keyCode==4) { //当前是返回键
7 if(currView!=null) {
8 switch(currView) {
9 case SET_VIEW: //当前在设置界面
10 SET_IS_WHILE=false;
11 Constant.set_flag=false;
12 gotoMenuView(); //到菜单界面
13 break;
14 case MENU_VIEW: //当前在菜单界面
15 MENU_IS_WHILE=false; //菜单界面是否循环工作标志位
16 Constant.menu_flag=false;
17 stopBeiJingYinYue(); //停止播放背景音乐
18 System.exit(0); //退出程序
19 break;
20 case GAME_VIEW: //当前在游戏界面
21 backdialog(); //显示提示对话框
22 break;
23 case ABOUT_VIEW: //当前在关于界面
24 Constant.about_flag=false; //关于界面是否循环工作标志位
25 gotoMenuView(); //返回菜单界面
26 break;
27 case HELP_VIEW: //当前在帮助界面
28 gotoMenuView(); //返回菜单界面
29 break;
30 case GUAN_VIEW: //当前在选关界面
31 Constant.select_flag=false; //选关界面是否循环工作标志位
32 Constant.SELECT_IS_WHILE=false; //选关界面是否循环工作标志位
33 gotoMenuView(); //返回菜单界面
34 break;
35 } }}
36 return false;
37 }
第3-5行是判断当前按下的键值,如果键值表示的是按下返回键,则在本方法中处理,否则不在本方法中处理。
第7-35行表示的是若当前界面不为空,则根据当前的界面做出不同的操作,即返回某个界面或显示对话框、或退出游戏。
(5)接下来为读者介绍的是播放背景音乐与停止播放背景音乐方法的开发,其代码如下。
1 public void playBeiJingYinYue(){ //播放背景音乐的方法
2 beijingyinyue=MediaPlayer.create(this,R.raw.mainmp3);
3 beijingyinyue.setLooping(true); //设置为循环模式
4 beijingyinyue.start(); //开始播放音乐
5 }
6 public void stopBeiJingYinYue(){ //停止播放背景音乐的方法
7 if(beijingyinyue!=null) {
8 beijingyinyue.stop(); //停止播放音乐
9 beijingyinyue=null;
10 }
11 SharedPreferences.Editor editor=sp.edit();
12 editor.clear(); //清空sp中存储的所有内容
13 editor.commit(); //提交
14 }
15 }
这两种方法的开发非常简单,其实现的主要功能是对MediaPlayer的控制,同时在停止播放背景音乐时要清空SharedPreferences对象sp中存储的内容。