版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河南城建学院本科毕业设计(论文)AbstractA毕业设计[论文]题目:维京矿工手机游戏系统学院:计算机科学与工程专业:计算机科学与技术姓名:学号:指导老师:"完成时间:2013年5月28号河南城建学院本科毕业设计(论文)摘要河南城建学院本科毕业设计(论文) 第三章河南城建学院本科毕业设计(论文) 参考文献第3章维京矿工game中对象本章节主要是对项目中对象的分析。Java是面向对象的程序设计,具有继承、封装等特点。为提高代码的复用性,此处将绳子,钩子,宝石等进行单独的封装。通过本章节的分析我们可以系统进一步了解代码的性与复用性。3.1对绳子的定义及分析Java是面向对象的设计语言。在进行编程时,需要对相同功能进行尽可能的抽取与封装,从而提高代码的复用性。因此对于该软件,分为几个对象进行如下封装。publicclassBlast{定义绳子的横纵坐标 privateinty; privateintx; privateAnimationblast; publicBlast(intx,inty){ this.x=x; this.y=y; blast=Animation.getAnimation("blast_28"); }定义基本方法: publicvoidlogic(){ if(blast!=null){ blast.loopFrame(GameCanvas.timeCha); } if(blast.isLastFrame()){ blast=null; GameView.gameView.blastV.remove(this); } }定义draw方法 publicvoiddraw(Canvasg){ if(blast!=null){ blast.drawFrame(x,y,g); } }}3.2对钩子的定义及分析对钩子类进行定义:钩子可以进行不动,向外,向里走,旋转角度进行定义。同时对绳子的移动速度进行控制,当绳子速度达到一定速度时,会变成红色的。此处变量均使用final关键字进行修饰,定义后不再被改变。定义hook方法,加载图片xiaogozi.png。 publicHook(){ imgHook=ImageManager.getBitmap("images/xiaogouzi.png"); x=(ImageManager.STANDARD_WIDTH-imgHook.getWidth())>>1; y=80+r; }此处ImageManager为AndroidGameEngine中的。该游戏中代码大量复用。因此将其单独封装进一个工程中。AndroidGameEngine是为了将游戏中的各种文字,图片,写入到手机中。其中,定义了手机屏幕的大小,以方便于进行适配。定义基本功能和速度,设置时间为1分钟: publicvoidlogic(){ if(count==1){ speed=20; if(speedstartTime==0){ rota=5; speedstartTime=System.currentTimeMillis(); } longendTime=System.currentTimeMillis(); if((endTime-speedstartTime)%60>=1000){ rota=3; speed=12; } } switch(state){ caseSTAND: //System.out.println(rotate); GameView.gameView.buttons[3].is_clicked=false; if(count==0){ speed=12; }elseif(count==1){ speed=20; } rotate+=rota; r=20; y=80+r;对于移动的绳子,根据坐标来判断其移动的位置。 //横向偏移量 //dx=-(int)(r*Math.sin(rotate*Math.PI/180)); //纵向偏移量 //dy=-(int)(r-r*Math.cos(rotate*Math.PI/180)); dx1=-(int)((r+imgHook.getHeight())*Math.sin(rotate*Math.PI /180)); dy1=-(int)((r+imgHook.getHeight())-(r+imgHook.getHeight()) *Math.cos(rotate*Math.PI/180)); System.out.println(dx1+"====="+dy1);设置半径大小,用来判断钩子是否够到宝石,方便进行捞取。 if(rotate>=75){ rotate=75; rota=-rota; }elseif(rotate<=-75){ rotate=-75; rota=-rota; } //matrix.setRotate(rotate,ImageManager.STANDARD_WIDTH>>1,80); break; caseMOVE_OUT: //半径增加 r+=speed; y=80+r; //dx=-(int)(r*Math.sin(rotate*Math.PI/180)); //dy=-(int)(r-r*Math.cos(rotate*Math.PI/180)); dx1=-(int)((r+imgHook.getHeight())*Math.sin(rotate*Math.PI /180)); dy1=-(int)((r+imgHook.getHeight())-(r+imgHook.getHeight()) *Math.cos(rotate*Math.PI/180)); if(r>=ImageManager.STANDARD_HEIGHT){ state=MOVE_IN; GameView.player.setState((byte)5); } collide(); break; caseMOVE_IN: in(); if(r<20){ r=20; y=80+r; //横向偏移量 //dx=-(int)(r*Math.sin(rotate*Math.PI/180)); //纵向偏移量 //dy=-(int)(r-r*Math.cos(rotate*Math.PI/180)); dx1=-(int)((r+imgHook.getHeight())*Math.sin(rotate *Math.PI/180)); dy1=-(int)((r+imgHook.getHeight())-(r+imgHook .getHeight())*Math.cos(rotate*Math.PI/180)); state=STAND; if(GameView.player.state==5){ GameView.player.setState((byte)0); } }当半径小于上面的值的时候,则判断为发生了撞机事件,从而判断其为抓起对象。 if(collide){ speed=startSpeed-tempMonster.getZhongliang()*2; if(r<25){//当半径小于25的时候移除抓取对象 collide=false; System.out.println(tempMonster.getGroup()); if(tempMonster.getGroup().equals("qiandai")){ intr=(GameView.gameView.random.nextInt()>>>1)%10; System.out.println(""+r); if(r==0||r==1){ jiaBei=1; }elseif(r==2||r==3){ GameView.gameView.currentTime=60; }elseif(r==4||r==5){ GameView.gameView.daliCount=1; count=1; speedstartTime=0; }else{ if(tempMonster.getGroup().equals("hongzhu") ||tempMonster.getGroup().equals("jinbi") ||tempMonster.getGroup().equals("lvzhu") ||tempMonster.getGroup().equals("qiandai")){ GameView.gameView.currentMoney+=200; GameView.gameView.moreAddMoney=200; }else{ GameView.gameView.currentMoney+=tempMonster .getValue(); GameView.gameView.addMoney=tempMonster .getValue(); } } } if(jiaBei==0){ if(tempMonster.getGroup().equals("hongzhu") ||tempMonster.getGroup().equals("jinbi") ||tempMonster.getGroup().equals("lvzhu") ||tempMonster.getGroup().equals("qiandai")){ GameView.gameView.currentMoney+=200; GameView.gameView.moreAddMoney=200; }else{ GameView.gameView.currentMoney+=tempMonster .getValue(); GameView.gameView.addMoney=tempMonster.getValue(); } }else{ if(tempMonster.getGroup().equals("hongzhu") ||tempMonster.getGroup().equals("jinbi") ||tempMonster.getGroup().equals("lvzhu") ||tempMonster.getGroup().equals("qiandai")){ GameView.gameView.currentMoney+=400; GameView.gameView.moreAddMoney=400; }else{ GameView.gameView.currentMoney+=tempMonster .getValue(); GameView.gameView.addMoney=tempMonster.getValue(); } } if(tempMonster.getValue()<100){ if(SoundManager1.getInstance().soundOn){ SoundManager1.getInstance().play(4,0); } GameView.player.setState((byte)2); }elseif(tempMonster.getValue()>=300){ if(SoundManager1.getInstance().soundOn){ SoundManager1.getInstance().play(3,0); } GameView.player.setState((byte)3); }elseif(tempMonster.getValue()>=100 &&tempMonster.getValue()<300){ //加分音效 if(SoundManager1.getInstance().soundOn){ SoundManager1.getInstance().play(1,0);//点击卡片发声 } } removeTarget(); } } break; } } //钩子上升时的量的变化 privatevoidin(){ //半径减少 r-=speed; y=80+r; //横向偏移量 //dx=-(int)(r*Math.sin(rotate*Math.PI/180)); //纵向偏移量 //dy=-(int)(r-r*Math.cos(rotate*Math.PI/180)); dx1=-(int)((r+imgHook.getHeight())*Math.sin(rotate*Math.PI /180)); dy1=-(int)((r+imgHook.getHeight())-(r+imgHook.getHeight()) *Math.cos(rotate*Math.PI/180)); } //判断碰撞的方法 publicvoidcollide(){ VectorvMap=GameView.gameView.getActors(); for(inti=0;i<vMap.size();i++){ Actorent=(Actor)vMap.elementAt(i); if(entinstanceofMonster){ Monstermonster=(Monster)ent; if(collide==false &&monster.inRange( (x+(imgHook.getWidth()>>1)+dx1),y +imgHook.getHeight()+dy1)){ tempMonster=monster; collide=true; in(); monster.state=monster.move; state=MOVE_IN; GameView.player.setState((byte)5); } } } }每一幅图片,在运行时都将被画到模拟器中,而绳子也是如此。因此我们定义了一个draw的方法。用来表示画绳子。而为了表示加速与否,将绳子定义为黑红二色。黑的为正常时候的颜色,红色则为加速后的颜色: publicvoiddraw(Canvasg){ //画黑色的绳子 if(count==0){ Graphics.PAINT.setColor(Color.BLACK); Graphics.PAINT.setStrokeWidth(2); //g.drawLine((ImageManager.STANDARD_WIDTH>>1),80, //x+(imgHook.getWidth()>>1)+(float)dx,y+(float)dy, //Graphics.PAINT); //画红色的绳子 }elseif(count==1){ Graphics.PAINT.setColor(Color.RED); Graphics.PAINT.setStrokeWidth(2); //g.drawLine((ImageManager.STANDARD_WIDTH>>1),80, //x+(imgHook.getWidth()>>1)+(float)dx,y+(float)dy, //Graphics.PAINT); } //g.setMatrix(matrix);对于钩子,在存在时也应画出。其实PAINT为new的一个对象。此处将其变成这样,主要是为了写的时候简便。 if(imgHook!=null){//勾子 intcx=ImageManager.STANDARD_WIDTH>>1; g.save(); g.rotate(rotate,cx,80); g.drawLine(cx,80,cx,y+2,Graphics.PAINT); g.drawBitmap(imgHook,x,y,Graphics.PAINT); g.restore(); } //g.setMatrix(null); }钩子有停止,钩起,伸出状态。每次钩起物品后,应该在返回到一定时间程度后清除。此处定义tempMonster是Monster的一个对象。表示如果有tempMonster,则清除掉。 /***移除钩子钩中的物品*/ publicvoidremoveTarget(){ if(tempMonster!=null){ GameView.gameView.getActors().removeElement(tempMonster); tempMonster=null; } }}3.3对宝物的定义及分析对于宝物进行定义。宝物用于加分数。每种宝石都有一定的值。加到一定额时,判断过关与否。为简单起见,将停止与开始设为1,2两个参数。而泛型Vector则是为了逐个遍历参数。 publicMonster(intx,inty,Stringgroup,Vector<String>params){ this.group=group; directionAnimations[0]=Animation.getAnimation(group+"_0"); animationCurrent=directionAnimations[0]; value=Integer.parseInt(params.elementAt(0)); zhongliang=Integer.parseInt(params.elementAt(1)); this.x=x; this.y=y; }下面的Camera其实是为了调节手机模拟器的大小。与当前手机相适应。本处接受两个参数。一个Canvas是指当前中用于游戏中的图片。而Camera是对手机模拟器进行调节。 publicvoiddraw(Canvasg,Cameracamera){ //TODOAuto-generatedmethodstub super.draw(g,camera); }Override是将该方法打上标签。当特殊情况时,不再提示。如,当其过时时,可以不再提示。Logic中当点击屏幕时,将会设置挂钩的位置为当前挂钩所在位置。 @Override publicvoidlogic(){ //TODOAuto-generatedmethodstub super.logic(); switch(state){ casemove: setPosition( (int)(GameView.hook.getX() +(GameView.hook.imgHook.getWidth()>>1)+GameView.hook.dx1), (int)(GameView.hook.getY() +GameView.hook.imgHook.getHeight()+GameView.hook.dy1)); break; default: break; } }3.4对绳子的定义及分析作为操作者矿工,他的功能有很多,例如放钩子,收钩子,为方便起见,也将各种动作设置为0~5各种值。具体如下:publicclassPlayer{ publicstaticfinalbytedaiji=0; /***待机状态*/ publicstaticfinalbytezhayan=1; /***眨眼状态*/ publicstaticfinalbytejusang=2;/***沮丧*/publicstaticfinalbytehappy=3;/***高兴*/ publicstaticfinalbytefanggouzi=4;/***放钩子*/ publicstaticfinalbyteshougouzi=5;/***收钩子*/ protectedbytestate=daiji;/**Actor状态*/ protectedAnimation[]anis=newAnimation[3]; privateAnimationtempAni; privateintx,y; privateinttime;3.5本章节总结本章节主要是对该手机游戏系统中的对象,如绳子,钩子,矿工,宝石有个初步的认识,明白要完成的功能,熟悉该软件的框架结构。本章节对game部分对象模块进行详述描述,本章节对技术性问题进行了初步分析。这些需求也是完成项目必不可少的部分。
第4章维京矿工主流程相关的类本章节主要是对项目的主流程进行描述。主要包括程序的返回主菜单,暂停,退出等功能。通过本章节的分析我们可以系统了解项目的基本流程,使我们更进一步了解与主流程相关的操作应该如何设计与实现。4.1主页面相关的类主页面主要是指当游戏进行到一半时,暂停,返回主页面,或者是退出游戏程序。这里的主要代码如下:此处单例模式创建页面。 publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); }此处,当值为暂停时,画面将会暂停。同时将会弹出对话框。而对于所有的点击事件来说,都有按下与松开两个事件。 publicbooleanonKeyDown(intkeyCode,KeyEventevent){ if(keyCode==KeyEvent.KEYCODE_BACK){ if(GameView.gameView!=null){ GameView.gameView.pause=true; } showDialog(0); }elseif(keyCode==KeyEvent.KEYCODE_VOLUME_UP){ returnfalse; }elseif(keyCode==KeyEvent.KEYCODE_VOLUME_DOWN){ returnfalse; } returntrue; }暂停后,这被protect修饰,外部访问需要有足够的权限才可以。 protectedvoidonPause(){ super.onPause(); if(GameCanvas.gameCanvas!=null){ if(WelcomeView.index==1){ SoundManager1.getInstance().pauseBackGround(); } if(count==0){ count=1; //GameCanvas.gameCanvas.appendView(newPauseView()); } } System.out.println(""); }监听窗口时间。在GUI编程中所有的事件都在监听后才能处理。否则,只能显示,操作时不会有任何反应。 @Override publicvoidonWindowFocusChanged(booleanhasFocus){ if(hasFocus){ if(WelcomeView.index==1){ count=0; SoundManager1.getInstance().playBackGround(); } if(GameView.gameView!=null){ if(GameView.index==0){ GameView.gameView.pause=false; } } } } publicintgetStreamVolume(){ AudioManagermAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE); returnmAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); } publicvoidonAdClick(){ //Toast.makeText(this,"onLeaveApplicationcalled!",Toast.LENGTH_LONG) //.show(); } privateAlertDialogdialog; privateAlertDialog.Builderbuilder; protectedDialogonCreateDialog(intid){ builder=newAlertDialog.Builder(this); if(id==0){ dialog=builder .setTitle("提示") .setMessage("是否退出游戏?") .setCancelable(false) .setPositiveButton("是", newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog, intwhich){ newThread(){ publicvoidrun(){ GoldActivity.ylAction.finish(); System.exit(0);//退出游戏 } }.start(); } }) .setNegativeButton("否", newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog, intwhich){ if(GameView.gameView!=null){ GameView.gameView.pause=false; } } }).create(); }elseif(id==1){ dialog=builder .setTitle("提示") .setMessage("是否返回主菜单?") .setCancelable(false) .setPositiveButton("是", newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog, intwhich){ newThread(){ publicvoidrun(){ GameCanvas.gameCanvas .setView(newWelcomeView()); } }.start(); } }) .setNegativeButton("否", newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog, intwhich){ if(GameView.gameView!=null){ GameView.index=0; GameView.gameView.pause=false; } } }).create(); } returndialog; }}4.2本章节总结本章节主要是对该手机游戏系统的主流程有个初步的认识,明白要完成的返回,暂停等功能,熟悉该软件的主要流程。本章节对主流程部分模块进行详述描述。本章节对技术性问题进行了进一步的分析。这些需求也是完成项目必不可少的部分。
第5章维京矿工与框架相关的类本章节主要是对项目中与框架有关的类的设计与实现。通过本章节的分析我们可以系统了解项目中如何优化存储,进一步熟悉链表,泛型等基本方法,通过本章节的分析我们更加流利的制作。5.1框架中button的类作为Util框架中的组件,可以有如下功能:首先为Button。Java中,Button有点击,松开的时间监听机制。作为触摸屏的Android手机,可以将整个屏幕作为一个大的按钮来看。按钮则有点击和松开两种情况。代码中都必须实现。 rect_btn=newRect(_x,_y,_x+_bitmapNormal.getWidth(),_y+_bitmapNormal.getHeight()); bitmapNormal=_bitmapNormal; bitmapClicked=_bitmapClicked; btn_paint.setStyle(Style.STROKE); btn_paint.setColor(0xffff0000); 对于游戏来说,完全过关后,将进入循环状态,从头开始。 publicvoidrecycle(){ if(bitmapClicked!=null){ bitmapClicked.recycle(); } if(bitmapNormal!=null){ bitmapNormal.recycle(); } }}5.2框架中控制分数的类对于游戏中所得的分数以及等级,也需要进行控制。这里我们设置一个类,用于对整个游戏过程中的得分进行控制。在对文件处理时,要抛出异常。此处将会对异常进行处理。 publicstaticbooleandeleteRMS(Stringname){ try{SharedPreferencesspf=GoldActivity.ylAction.getSharedPreferences( name,GoldActivity.MODE_PRIVATE); Editoredit=spf.edit(); edit.clear(); mit(); returntrue; }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } returnfalse; }Vector为底层数据结构,已经过时,被ArrayList所替代。是数组型的,可以存储数据。此处将其存储后并开始遍历vector。 publicstaticVector<String>getSkillLevel(Stringname){ Stringstr=null; Vector<String>vector=newVector<String>(); try{ SharedPreferencesspf=GoldActivity.ylAction.getSharedPreferences( name,GoldActivity.MODE_PRIVATE); if(spf.getAll().size()==0){ returnnull; } intl=spf.getAll().size(); for(inti=0;i<l;i++){ str=spf.getString(String.valueOf(i),""); if(!vector.contains(str)){ vector.add(str); } } returnvector; }catch(Exceptione){ } returnvector; }5.3框架中控制音效的类在整个游戏的过程中,我们都设置了音效,用于增加游戏的趣味性。这里,也应该有一个类,用来控制音乐场景的播放。此处为单例模式,只有一个地方可以控制音乐的播放。getInstance()就是将对象new出来之后,外部不能再定义其他的对象。 publicstaticSoundManager1getInstance(){ if(record==null){ record=newSoundManager1(); } returnrecord; }该方法创建一个背景音乐。 publicvoidinitSounds(){ mediaPlayer=MediaPlayer.create(GoldActivity.ylAction,R.raw.background); if(mediaPlayer!=null){ mediaPlayer.setLooping(true); } } publicvoidloadSfx(intraw,intID){ //把资源中的音效加载到指定的ID(播放的时候就对应到这个ID播放就行了) soundPoolMap.put(ID,soundPool.load(GoldActivity.ylAction,raw,ID)); } publicvoidplay(intsound,intuLoop){ //获取系统当前单量 soundPool.play(soundPoolMap.get(sound),((GoldActivity)GoldActivity.ylAction).getStreamVolume(), ((GoldActivity)GoldActivity.ylAction).getStreamVolume(),1,uLoop,1f); }对音乐的几种操作。 //播放背景音乐 publicvoidplayBackGround(){ if(soundOn){ if(mediaPlayer!=null){ mediaPlayer.start(); } } } //关闭背景音乐 publicvoidstopBackGround(){ if(soundOn==false){ if(mediaPlayer!=null){ mediaPlayer.stop(); } } } //暂停背景音乐 publicvoidpauseBackGround(){ if(soundOn){ if(mediaPlayer!=null){ mediaPlayer.pause(); } } }}5.4框架中写文字图片的类对带文字的图片写入到该游戏中。此处都是对文件进行读写的操作。读写的操作都需要进行异常的处理: publicstaticInputStreamgetResources(Stringpath,Stringdata){ InputStreamis=null; try{ is=GoldActivity.ylAction.getAssets().open(path+data); }catch(IOExceptione){ e.printStackTrace(); } returnis; } publicstaticInputStreamgetResourceAsStream(Stringpath)throwsIOException{ if(path.startsWith("/")){ path=path.substring(1); } returnGoldActivity.ylAction.getAssets().open(path); }写文件开始通过调用来实现图片的绘制。 publicstaticBitmapcreateImage(byte[]imageButton,intimageOffset,intimageLength){ returnBitmapFactory.decodeByteArray(imageButton,imageOffset,imageLength); } publicstaticvoiddrawRegion(Canvasg,Bitmap[]imgNums,intnum,intx,inty,Paintpaint){ if(imgNums==null){ return; } intindex=0; StringsNum=String.valueOf(num); for(inti=0;i<sNum.length();i++){ charvalue=sNum.charAt(i); index=value-48; g.drawBitmap(imgNums[index],x,y,paint); x+=25; }5.5与视图相关的类对视图进行判断并绘制: publicvoiddraw(Canvasg){ if(aboutWord!=null){ g.drawBitmap(aboutWord,(ImageManager.STANDARD_WIDTH-aboutWord.getWidth())>>1,((ImageManager.STANDARD_HEIGHT-aboutWord.getHeight())>>1),null); } if(button!=null){ button.draw(g); } } @Override protectedvoidinit(){ Log.d("======","ninininini"); aboutWord=ImageManager.getBitmap("images/guanyuneirong.png"); tuichuImg=ImageManager.getBitmap("images/smalltuichu.png"); button=newButton(tuichuImg,tuichuImg,aboutWord.getWidth()-tuichuImg.getWidth()+((ImageManager.STANDARD_WIDTH-aboutWord.getWidth())>>1)-20,30+(ImageManager.STANDARD_HEIGHT-aboutWord.getHeight())>>1); }创建一个函数对触屏事件进行监听: publicvoidonTouchDownEvent(MotionEventevent,floatxF,floatyF,intx, inty){ if(button!=null){ if(button.isClicked(x,y)){ //加分音效 if(SoundManager1.getInstance().soundOn){ SoundManager1.getInstance().play(5,0);//点击卡片发声} GameCanvas.gameCanvas.closeTopView(); } } }由于篇幅有限我们在此处不在做过多的分析。要完成本操作还需要几个javabeen对象。我UserDao等类事使用了接口编程的思想,接口首先是一种规范,它只定义一些方法,并不实现。在内存中没有实力对象。再者,我认为接口和抽象类的另一个区别在于,抽象类和它的子类之间应该是一般和特殊的关系,而接口仅仅是它的子类应该实现的一组规则。(当然,有时也可能存在一般与特殊的关系,但我们使用接口的目的不在这里)如,交通工具定义成抽象类,汽车、飞机、轮船定义成子类,是可以接受的,因为汽车、飞机、轮船都是一种特殊的交通工具。再譬如Icomparable接口,它只是说,实现这个接口的类必须要可以进行比较,这是一条规则。如果Car这个类实现了Icomparable,只是说,我们的Car中有一个方法可以对两个Car的实例进行比较,可能是比哪辆车更贵,也可能比哪辆车更大,这都无所谓,但我们不能说“汽车是一种特殊的可以比较”,这在文法上都不通。“面向接口编程”中的接口是一种思想层面的用于实现多态性、提高软件灵活性和可维护性的架构部件,而具体语言中的“接口”是将这种思想中的部件具体实施到代码里的手段。5.6本章总结通过本章节的可以系统的了解该游戏软件的部分的框架结构,以及部分功能的实现。在本系统还有很多不足之处。例如,作为游戏很多地方的代码都是可以复用的。而作为Java来说,封装性是很关键的。那么如何提高代码的复用性是个很关键的问题。需要进一步改进。在做部分的时候主要是为了维京矿工游戏部分的实现。对于手机本身的设置则没有详细的说明。
第6章运行结果演示本章节主要是对项目的运行结果进行展示。通过展示,让我们对游戏的流程有进一步的了解,各种使用,功能展示等详细的描述。通过本章节的分析我们可以系统了解项目的基本流程,通过本章节的分析我们更加流利的制作。6.1结果视图1、进入维京矿工的主菜单运行如下图4-1页面。图4-1主菜单图4-2帮助页面2、当点击帮助时,出现如上面图4-2页面。3、默认是有声音的,如果不想让其有声音,那么点击音乐图标时,出现静音模式。如下图4-3所示。图4-3静止声音图4-4关于页面4、为了将作者的信息显示出来,我们单独弄了一个页面用来显示,如上图4-4所示。5、在主场流程中,如果出现退出的情况,则会出现如下4-5页面。图4-5提示是否退出游戏图4-6下一个页面6、对于游戏的开发的相关信息,有也小故事来说明。如上图4-6示。7、当进入游戏时,会提示如果要过本关需要的分数。如下4-7为第一关的分数。图4-7第一关起始页面图4-8第一关页面8、第一关的页面如图4-8所示。9、当挑战失败时,会出现如下图4-9提示。让其知道游戏结束。图4-9失败页面图4-10成功后从商店购买道具页面10、当第一关过来后,有足够的金额,可以购买图4-10中所示的道具。11、如下图4-11为购买时间,进行时间恢复的图片。图4-11购买了时间的页面图4-12返回主菜单页面12、当在游戏中时,可以推出进入主菜单,如图4-12所示。6.2本章总结通过本章,可以更加清晰明确的看出该游戏的特点:绚丽的色彩,多种多样的功能。简单操作,趣味性强,简单易懂。是个非常易于操作和娱乐的游戏项目。不论是在旅行,还是在工作闲暇之余,只需要一部手机,你就可以享受到非常好的游戏娱乐。
结论此设计是我在看视频的过程中根据视频做的一个项目,用时7天,由于时间有限,其中有许多不足。在编写的过程中也遇到许多问题,例如乱码问题把我困惑了两天,由于要实现数据的存取,在不同的平台中会出现乱码,在上部分我以对乱码问题做了简述。要想做个项目,系统框架很重,Android有其自己的编程模型。对于Android的编写有的类的方法需要传递许多参数。这不得不认真阅读API。如何运用已经有的代码也是很重要的,有些方法网上已经有了很好的是想方法这里我们就没有必要自己去写了,做个好的项目,学会用别人写好的类方法是很重要的。Android的编写过程中需要设计许多的内部类,如何得到内部类的对象,以及在内部类如何调用外部类的属性和方法也是很重要的。Android为什么会使用内部类,个人理解是由于内部类的hashcode码很相似,众所周知hashcode码在一定程度上可以看变作类的物理地址,估计是由于这样地址比较相近,可以快速的读取数据。手机编程的问题,手机不是pc机可以大量的浪费内存和电量,在手机的编程中内存和耗电量是不得不考虑的问题。可以根据实际情况使用一些轻量级的类以实现节省内存的目的。手机的电量有限我们要达到相同的功能调用一些不怎么耗电的方法是很重要的。以下是本次设计总结的心得总结:1自定义组件的显示问题,在写自定义View的时候经常要对视图的X、Y调整,以达到预期的理想位置。因此,通过使用AndroidGameEngine对代码进行复用,大大提高了代码复用性。可以讲每个组件的X、Y坐标值画到组件旁边,这样很直观,一看就知道该怎样调整。2使用Log来打印日志和进行调试。3使用LogCat视图,在showView中有LogCat视图,LogCat视图会显示一些Android仿真器打印出的堆栈信息,对应用的调试非常有帮助,另外Log打印的日志也在这边显示。4使用EmulatorControl视图,EmulatorControl可以完成一些简单的设备操作,比如,模拟来电,短消息。5活用tools目录下的工具,该目录在AndroidSDK中都有提供,通过这些工具可以操作Android仿真器,比如,创建一个虚拟SD卡,将系统中的文件移动到虚拟SD中,Android都有提供相应的工具,相关命令可以上网查阅。
参考文献[1]李观华,范辉.J2ME在移动通信程序中的应用.计算机应用,2003,[2]廖永刚,余冬梅,张秋余.J2ME架构与安全机制的研究.计算机程序设计,2006,[3]张培仁,《基于C语言编程MCS-51单片机原理与应用》,电子工业出版社[4]EdBurnette.Hello,Android:IntroducingGoogle’sMobileDevelopmentPlatform.PragmaticBookshelf,2008
[5]阎石编,《数字电子技术基础》,
高等教育出版社,2003
[6]康光华,《模拟电子技术基础》,高等教育出版社,2003
[7]王勤,《计算机控制技术》,机械工业出版社,2003
[8](美)普埃克等著,李锵等译,《通信系统原理》(美),电子工业出版社,20
[9]刘令普,《数字信号处理》,哈尔滨工业大学出版社,2002
[10]夏靖波,《嵌入式系统原理与开发》,西安电子科技大学出版社,2007
[11]庞特,《C语言嵌入式系统开发》,中国电力出版社,2006
[12]Saint-Andre,P.StreamingXMLwithJabber/XMPP[J].InInternetcomputing,IEEE,2005
[13]胡伟,《ARM嵌入式系统基础与实践》,北京航空航天大学,2007
[14]孙秋野
孙凯
冯健,《ARM嵌入式系统开发典型模块》,人民邮电出版社,2007[15]肖峰陈爱国,无线数据采集模块设计[J],现代电子技术,2008
[16]谢述理,一种多通道声波测井井下数据采集模块[J],声学与电子工程,2008
[17]张彪徐晓辉张红涛,一种无线数据采集模块的设计[J],应用天地,2006
[18]汤凯为胡蓉,一种智能数据采集模块的设计电脑知识与技术[J],2008,8
[19]张健浪,GoogleAndroid:开放平台攻陷移动互联网,信息产业部电子第五十二研究所,2008,[20]陈星江兰帆,基于GoogleAndroid平台的移动开发研究.福建电脑,2008,[21]Android官方文档。河南城建学院本科毕业设计(论文) 附录附录packagecom.lyl;importandroid.app.Activity;importandroid.app.AlarmManager;importandroid.app.AlertDialog;importandroid.app.Dialog;importandroid.app.PendingIntent;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.DialogInterface;importandroid.content.Intent;importandroid.content.IntentFilter;importandroid.media.AudioManager;importandroid.os.Bundle;importandroid.view.KeyEvent;importcom.javenwong.android.engine.GameActivity;importcom.javenwong.android.engine.GameCanvas;importcom.lyl.wjkg1.R;importcom.util.RecordManager;importcom.util.SoundManager1;importcom.view.GameView;importcom.view.WelcomeView;publicclassGoldActivityextendsGameActivity{ publicstaticActivityylAction; privateintcount=0; //privateAdViewadView; privateStringMY_AD_UNIT_ID="a14f8faa197b13c"; privateBroadcastReceiverreceiver; publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); ylAction=this; //ImageManager.STANDARD_HEIGHT=560; //gameCanvas=(GameCanvas)findViewById(R.id.game); //gameCanvas=newGameCanvas(this); gameCanvas.setView(newWelcomeView()); // setContentView(R.layout.main); } publicbooleanonKeyDown(intkeyCode,KeyEventevent){ if(keyCode==KeyEvent.KEYCODE_BACK){ if(GameView.gameView!=null){ GameView.gameView.pause=true; } showDialog(0); }elseif(keyCode==KeyEvent.KEYCODE_VOLUME_UP){ returnfalse; }elseif(keyCode==KeyEvent.KEYCODE_VOLUME_DOWN){ returnfalse; } returntrue; } protectedvoidonPause(){ super.onPause(); if(GameCanvas.gameCanvas!=null){ if(WelcomeView.index==1){ SoundManager1.getInstance().pauseBackGround(); } if(count==0){ count=1; //GameCanvas.gameCanvas.appendView(newPauseView()); } } System.out.println(""); } @Override publicvoidonWindowFocusChanged(booleanhasFocus){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 清廉医院建设的责任制落实总结
- 城市规划与社会主义核心价值观结合的方案
- 儿童心理辅导制度建设
- 2024年度碳交易市场建设项目合作合同
- 郑州大学《机械原理》2021-2022学年第一学期期末试卷
- 2024年度技术开发与转让合同
- 2024年度凌柏个人房屋买卖合同及附属设施转移
- 低压二氧化碳充装在食品行业应用方案
- 2024年度别墅、洋房电气设备安装合同
- 2024年度房屋买卖合同:二手住宅买卖协议
- 房地产经纪指南:业务流程介绍
- 中华人民共和国保守国家秘密法解读学习
- 中秋国庆慰问品采购慰问品供货实施方案
- 2024年海南乐东县乐供“菜篮子”发展有限公司招聘笔试参考题库含答案解析
- 保安市场行业市场现状分析及对策
- JGJT280-2012 中小学校体育设施技术规程
- 幼儿园大班健康领域指南目标
- 大型机械设备安全操作培训
- 管道阀门更换施工方案
- 人教版小学数学三年级上册周长【全国一等奖】
- 幼儿园小班音乐游戏活动《小老虎吃糖》教学设计【含教学反思】
评论
0/150
提交评论