全部博文(436)
分类: WINDOWS
2010-11-11 22:35:41
在本阶段,我们主要就上阶段遗留的两大问题进行了分析和解决。这两大遗留问题分别是:选关连接和添加音效。另外为了与实际契合,我们将只能利用鼠标点击(或者说是手机触屏)方式进行的操作增加了键盘操作的功能。同时我们也对第一、二关卡的界面进行了进一步地加工。
在上一个阶段里,我们的选关与对应关卡的游戏没有进行成功的连接。问题并不是出在语法上和实现方法上,而是在于界面的搭建上。因为选关涉及到至少两个activity之间的跳转,而第二个被选中的activity的界面并没有成功的搭建,因此导致程序被迫中止。
利用一个监听函数了解玩家的选择,然后根据不同的选择调用不同的activity。重点语句如下:
Intent intent = new Intent();
intent.setClass(cr.this, testGame.class);
startActivity(intent);//调用一个新的Activity
cr.this.finish();//关闭原本的Activity
为了方便试验,我们最开始是将不同的Activity放到不同的工程中进行的。因此在放入同一个工程时要注意ID不能重复。另外对于界面来说最好是复制之前的工程文件,改名之后导入,以避免不必要的错误发生。最后还要注意在AndroidManifest.xml文件添加新导入的activity。或者也可以再新建一个xml文件,但是要注意选择文件时一定要选择Android XML File文件,而不是XML文件。
在测试程序的过程中,我们想到手机游戏开发必然能够进行键盘操作,而我们的开发却只适用于触屏模式,于是我们希望能够参照上一届同学飞向月球的程序,对键盘的上下左右键进行键盘的绑定。但是这种方式我们不仅要对可能出现的每种移动情况进行举例,而且这样会导致程序可读性降低,代码复杂难懂等诸多问题的出现。这时候,按钮给了我一个提示,我们发现键盘的方向键默认情况下是可以对按钮进行操作的,这样我们就将ImageView改成ImageButton,将牌面的图片用ImageButton.setImageResource()方法来实现,减少了代码的复杂性,增加了可读性。实现界面如下
先添加一个基于service的类,在该类内添加音效文件和开始、结束的条件预定。然后注意在AndroidManifest.xml文件中添加新建项的相关内容。这些工作都完成之后就可以在需要音效的地方“开启服务”。语言如下:
private Intent intent = new Intent("com.angel.Android.MUSIC");
startService(intent);
第二关的键盘控制还没有能实现,当然利用触屏方式是没有任何问题的。
下一阶段已经是汇报的最后时间,我们希望能够赶在最终时间之前再进行一次总体规划。例如风格的统一、最后的调试、是否能够在增加其他应用、能否体现我们的特色等等方面进行综合思考。
由于今天是本阶段的最后一天,组内成员手头的任务并没有完成,因此我们小组早早的就起床开始自己的任务。由于本组成员内有男有女,所以并没有一个很好的、实际的交流空间,于是我们利用QQ。在QQ里建立了一个讨论组,每个人都可以把自己的想法通过这个平台与大家交流。更值得一提的是今天,早上大家从7:30起床开始到下午14:30都没有休息。其间,我多次让大家一起去吃午饭,可是每个人给我的回答都是:“还有一会儿,我这个还没有成功!”这种执着真的让我感动。我不是很会表达,也许我这么说会让大家觉得我很矫情。但是作为组长,怕的不就是组员不干事,不听安排吗?而我有这么努力、这么不分你我的组员,我真的很高兴,也很幸福。也许我们做出来的东西很稚嫩,也许我们还有很多需要改进的地方,但是作为一个临时成立的团队,我们做到了团队协作,做到了共同进步。没有比这个更加可贵的了。
在这个阶段我们继续对游戏进行完善,在纸牌游戏中把需要用电脑上鼠标控制的功能,转化成使用手机键盘上下左右键对扑克牌进行操作的功能。上一个阶段没有解决选关和游戏的连接问题。这个阶段我们继续进行深入的研究。最终解决了这个技术难题。在上次有关R中id的问题也已经解决。因为游戏选关的程序和纸牌游戏是两个独立的程序,所以有各自的id,在连接关卡的时候可以把两个程序放在同一个文件夹下,并对main.xml和R类中的id进行修改和扩充,防止产生id冲突。从选关界面跳到游戏时还是用到了上次使用的intent,只是稍加修改,用法相似。把上次的Intent intent=newIntent(); intent.setClassName(this,"com.webabcd.view._"+mData.get(position));startActivityForResult(intent,0);改为Intent intent = new Intent();intent.setClass(cr.this,testGame.class);startActivity(intent);
就实现了选关的功能。主要的区别是在上次是寻找地址,而这次是直接给出的地址。
——陈卓
继上阶段的成果之后,我们针对上阶段的遗留问题——选关连接进行了解决。首先,先了解了选关的实现方法。即是不同类之间的切换,就如同Windows编程中classname.DoModal()实现的方式一样,仅仅是语法上的差异。然后逐步分析了上次失败的原因所在。1、语法问题?并没有提示错误,排除!2、实现方法问题?先用一个变量记录调用的activity,然后调用该activity并终止当前的activity。没有逻辑错误!3、界面初始化失败。打开要调用的activity界面,发现之前的界面并不存在。问题发现了,但又该如何解决呢?第一步,先删除错误的界面实现文件。然后将原关卡工程中的main.xml文件复制到layout文件夹内,然后更名为main2.xml。注意在导入main2.xml后对应类的初始化调用语句的名字也要发生相应的改变。最后我们进行了测试,选关功能能够成功运行。
——李玲
这一阶段主要完成的是关卡连接。在上一个阶段中没有成功,通过查找各方面的资料,终于有了解决办法。其实并不是语法和方法的错误,方法上还是先是对Activity的.java文件的编写,在这个文件中需要用到Intent intent =new Intent()来找到下一个Activity;其次在这里还要利用setContentView()显示所对应的.xml所配置的界面;除此以外,还要对AndroidManifest.xml进行相关设置等等。错误在于界面初始没有设置。上一阶段中建立的仅仅只是.xml的代码设计,并没有在界面的实际设计中添加进去。所以,这阶段在layout中新建Android XML file,便会出现存在Layout的界面设计,然后把代码添加到Android XML file中的.xml中。这一阶段,不仅实现了关卡连接这个功能,而且学会了排查错误的方法,收获很大。
——陈艳玲
这周最大的收获就是关卡的选择功能(ACTIVITY的调用)和背景音乐的插入完成了。Activity的调用方法很多。我们尝试了两种方法,一种是多级调用:
{findView();
setListenner();}
private void findView(){button0= (Button) findViewById(R.id.button0);}
privatevoidsetListenner(){button0.setOnClickListener(btnAddListener)}
private View.OnClickListener btnAddListener = new View.OnClickListener() {public void onClick(View v) {Intent intent = newIntent(ActivityMain.this, testgame.class);startActivityForResult(intent,0);}};
另一种方法是普通的函数实现:
Intent intent = new Intent();
intent.setClass(cr.this, testGame.class); //调用一个新的Activity
startActivity(intent);//关闭原本的Activity
cr.this.finish();
这种方法与第一种没有本质的区别,只是将所用的多个函数放在一起,理解上更容易。
另外,对于音乐的插入我们也有了一些成果。我们查找到了两种音效的使用方法:
一种是使用直接使用MediaPlayer声明的如下函数:
mediaPlayer = MediaPlayer.create(this, R.raw.mmp);
mediaPlayer.setLooping(true);
mediaPlayer.start();
这种方法的优点是实现简单,对于单一音乐或是较小的音乐播放是比较合适的,但是如果音乐文件过大,导致加载不完全,会出现很严重的后果(程序的进程被破坏)。
另一种方法是使用音乐池(SoundPool)和Hash链表,这种方法是将要播放的音乐放入音乐池中,以Hash表的方式调用,它的好处是可以加载多个音乐文件,并且可以使用多线程不阻塞调用,在加载出错时不会产生严重后果;缺点是比较复杂。
——吴雄飞
本阶段我和另一名同学在上一阶段的基础上对游戏的选牌(或选择重新开始)和确定进行了键盘绑定,即实现真正的手机游戏功能。此前,我们的游戏只能用鼠标控制,想要使之在手机上运行,就必须进行键盘绑定。为此,我们参照了上一届的飞上月球的程序中的键盘绑定,发现需要对每个键添加监听者,这样的话会是程序变得很复杂,又上网查询了一些相关方法,迷茫了两三个小时后,我们发现,可以用键盘控制“重新玩一次”按钮,却不能对牌面进行选择。我们就想是否可以将牌面的属性由ImageView改成ImageButton,(即将牌面和牌面背景放在ImageButton上),这样实施后惊奇的发现居然真的实现了键盘控制,这让我们兴奋不已。经过这一阶段的学习和实践,我发现很多我们觉得不可能或是很难实现的东西,只要肯钻研,对其不恐惧,相信自己可以完成,经过努力还是可以实现的。
——陈艳艳
在本阶段,我们对上阶段的开发成果进行了更加详细的设计和功能上的完善,在测试程序的过程中发现我们的游戏少了一个重要的开发内容,只能用鼠标操作,在智能手机上不能运行。而真正可以用手机控制的程序,必须添加相应的键盘绑定,以达到用键盘控制的目的。因此我们参照上一届同学飞向月球的程序,对键盘的上下左右键进行键盘的绑定,在键盘绑定的功能中,要对可能出现的每种移动情况进行举例,通过case语句一一说明,程序的可读性,大大降低,而代码的复杂度则提高了很多。于是,我们试图寻找一种简单的能用键盘控制的方法,通过多次测试时间,我们发现键盘的方向建默认情况下是可以对按钮进行操作的,于是我们对程序做了大胆的改动,将牌面的依托ImageView改成ImageButton,将牌面的图片用ImageButton.setImageResource()方法来实现。通过这种方法,我们用最简短,可读性最强的代码实现了键盘控制。在本阶段,我最大的收获就是思路的开阔,实现某个功能,不一定用最传统的方法,拓宽自己的思路很重要,熟知每个组建的特性及Android本身的功能可以编程带来意想不到的帮助。
——付佳丽