应用软件课程设计第二阶段实验报告.docx
- 文档编号:10271808
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:27
- 大小:1.37MB
应用软件课程设计第二阶段实验报告.docx
《应用软件课程设计第二阶段实验报告.docx》由会员分享,可在线阅读,更多相关《应用软件课程设计第二阶段实验报告.docx(27页珍藏版)》请在冰点文库上搜索。
应用软件课程设计第二阶段实验报告
应用软件开发实践
第二阶段实验报告
————忍者快跑(Android)
姓名:
XXX
学号:
XXXX
班级:
XXXXX
目录
1.游戏截图2
2.实验目的3
3.实验背景3
4.程序描述3
5.关键源码算法4
6游戏源代码17
7.实验心得体会:
17
游戏截图
图1游戏开始界面
图2游戏运行界面
图3游戏中成就界面
图4游戏结束界面
2.实验目的
根据忍者快跑的功能需求,提出一系列技术问题,并进行深入详细剖析之后,给出主要的解决方案,为进一步设计软件、编写代码打下基础。
并对初步了解Android平台的开发环境和技术有所帮助。
3.实验背景
忍者快跑做为一款休闲类酷跑小游戏,受到很多人的喜爱。
本项目就来制作一款Android平台上的忍者快跑游戏,方便用户随时随地享受这款休闲小游戏。
游戏启动之后进入主菜单界面,点击按钮之后进入相应的界面。
在游戏界面中人物会自动向前奔跑,点击屏幕之后人物会上跳,点击攻击按钮会发出忍者镖进行攻击,随着奔跑距离的增加人物奔跑速度会相应加快。
4.程序描述
进入游戏之后首先显示菜单界面,在该界面上点击菜单可以进入相应的界面。
点击开始进入游戏主界面,在该界面上可以控制人物向前奔跑。
点击成就进入成就界面,显示之前游戏的成就。
点击退出按钮,退出游戏。
图4主业务流程图
5.关键源码算法
这是程序的目录结构
图5程序目录结构图
5.1游戏循环算法
//事件方法
publicvoidonTouchEvent(MotionEventevent){
if(event.getAction()==MotionEvent.ACTION_DOWN){
if(newRect(NinjaRushSurfaceView.screenW*60/100,NinjaRushSurfaceView.screenH*38/100,NinjaRushSurfaceView.screenW*90/100,NinjaRushSurfaceView.screenH*58/100).contains((int)event.getX(),(int)event.getY())){
isPlay_down=true;
}
elseif(newRect(NinjaRushSurfaceView.screenW*60/100,NinjaRushSurfaceView.screenH*55/100,NinjaRushSurfaceView.screenW*90/100,NinjaRushSurfaceView.screenH*75/100).contains((int)event.getX(),(int)event.getY())){
isAchi_down=true;
}
elseif(newRect(NinjaRushSurfaceView.screenW*60/100,NinjaRushSurfaceView.screenH*75/100,NinjaRushSurfaceView.screenW*90/100,NinjaRushSurfaceView.screenH*95/100).contains((int)event.getX(),(int)event.getY())){
isOpen_down=true;
}
elseif(newRect(0,0,NinjaRushSurfaceView.screenW/4,NinjaRushSurfaceView.screenH/3).contains((int)event.getX(),(int)event.getY())){
isMore_down=true;
}
}
if(event.getAction()==MotionEvent.ACTION_UP){
//开始的监听
if(newRect(NinjaRushSurfaceView.screenW*60/100,NinjaRushSurfaceView.screenH*38/100,NinjaRushSurfaceView.screenW*90/100,NinjaRushSurfaceView.screenH*58/100).contains((int)event.getX(),(int)event.getY())){
NinjaRushSurfaceView.status=Tools.GAME_LOADING;
}
//成就的监听
elseif(newRect(NinjaRushSurfaceView.screenW*60/100,NinjaRushSurfaceView.screenH*55/100,NinjaRushSurfaceView.screenW*90/100,NinjaRushSurfaceView.screenH*75/100).contains((int)event.getX(),(int)event.getY())){
Intentintent=newIntent(context,UserAchieve.class);
context.startActivity(intent);
}
//退出按钮的监听
elseif(newRect(NinjaRushSurfaceView.screenW*60/100,NinjaRushSurfaceView.screenH*75/100,NinjaRushSurfaceView.screenW*90/100,NinjaRushSurfaceView.screenH*95/100).contains((int)event.getX(),(int)event.getY())){
NinjaRushSurfaceView.flag=false;
GameMusic.releaseMusic();//释放背景音乐资源
GameMusic.releaseSound();//释放音效资源
System.exit(0);
}
//更多按钮的监听
elseif(newRect(0,0,NinjaRushSurfaceView.screenW/4,NinjaRushSurfaceView.screenH/3).contains((int)event.getX(),(int)event.getY())){
Intentintent=newIntent(context,DeveloperActivity.class);
context.startActivity(intent);
}
isPlay_down=false;
isAchi_down=false;
isOpen_down=false;
isMore_down=false;
}
}
5.2界面绘制
publicvoidmyDraw(){
try{
canvas=holder.lockCanvas();
if(canvas!
=null){
switch(status){
//绘制loading界面
caseTools.GAME_LOADING:
loading.draw(canvas,paint);
break;
//绘制GAME_MENU界面
caseTools.GAME_MENU:
gameMenu.draw(canvas,paint);
break;
//绘制GAME_PLAYING界面
caseTools.GAME_PLAYING:
gameing_bg.draw(canvas,paint);
for(inti=0;i veEnemy.elementAt(i).onDraw(canvas,paint); } mapDraw(); mybutton.draw(canvas,paint); player.draw(canvas,paint); //子弹 for(inti=0;i vetorBullet.elementAt(i).onDraw(canvas,paint); } //死亡效果 for(inti=0;i veDead.elementAt(i).onDraw(canvas,paint); } //食物 for(inti=0;i vcFood.elementAt(i).onDraw(canvas,paint); } //绘制Boss if(boss! =null){ if(boss.isDead()==false){ boss.draw(canvas,paint); } } //boss子弹 if(boss! =null){ for(inti=0;i vetorBulletBoss.elementAt(i).onDraw(canvas,paint); } } break; //绘制GAME_OVER界面 caseTools.GAME_OVER: //将最后的米数给gameover界面 Game_Over.latestmeter=gameing_bg.getMeter(); gameover.draw(canvas,paint); break; //绘制GAME_PAUSE界面 caseTools.GAME_PAUSE: gameing_bg.draw(canvas,paint); mapDraw(); pause.draw(canvas,paint); break; } } }catch(Exceptione){ e.printStackTrace(); }finally{ if(canvas! =null){ holder.unlockCanvasAndPost(canvas); } } } 5.4游戏逻辑碰撞检测 publicvoidlogic(){ switch(status){ //loading界面逻辑 caseTools.GAME_LOADING: if(isFirstLoadLoading){ initImage(); isFirstLoadLoading=false; } init(); status=Tools.GAME_PLAYING; if(countMusic++==0){ GameMusic.startMusic();//播放GAME_PLAYING界面背景音乐; GameMusic.playSound(R.raw.land,0);//播放一次落地音效 }else{ GameMusic.nextMusic(R.raw.bg); GameMusic.playSound(R.raw.land,0);//播放一次落地音效 } break; //GAME_MENU界面逻辑 caseTools.GAME_MENU: gameMenu.logic(); break; //GAME_PLAYING界面逻辑 caseTools.GAME_PLAYING: gameing_bg.logic(); ///////////// for(inti=0;i gameMap=vcMap.elementAt(i); if(gameMap.isDead()){ vcMap.remove(i); }else{ gameMap.logic(); vcMap.elementAt(i).setYy(gameing_bg.getYy()); } } .getLeftY(),style,true); vcMap.add(gameMap); }else{ gameMap=newGameMap(fly_bam_left,fly_bam_mid, fly_bam_right,dre4,light,screenW,vcMap .elementAt(vcMap.size()-1) .getLeftY(),style,false); vcMap.add(gameMap); } } } } //设置地图速度 for(inti=0;i vcMap.elementAt(i).setSpeed(gameing_bg.getBgspeed()*5); } //设置敌人速度 for(inti=0;i if(veEnemy.elementAt(i).getEnemyType()==Tools.ENEMY_DAO){ veEnemy.elementAt(i).setSpeed(gameing_bg.getBgspeed()*5); } //设置食物速度 for(intj=0;j vcFood.elementAt(j).setSpeed(gameing_bg.getBgspeed()*5); vcFood.elementAt(j).setYy(gameing_bg.getYy()); } } //设置子弹偏移量 for(inti=0;i vetorBullet.elementAt(i).setYy(gameing_bg.getYy()); } for(inti=0;i vetorBulletBoss.elementAt(i).setYy(gameing_bg.getYy()); } //////////// //忍者的逻辑处理----------------------------------------------------------------------------------------------------- player.logic(); //判断忍者与木桩的碰撞 for(GameMape: vcMap){ //判断主角是否在地上的桥之上 if((player.getPosition()[0]+player.getPosition()[2]>=e .getleftX()&&player.getPosition()[0]<=e.getEndX()) &&(player.getPosition()[1]+player.getPosition()[3]>=e .getLeftY()&&player.getPosition()[1] +player.getPosition()[3]<=e.getLeftY() +Tools.NINJA_SPEED) &&(e.getStyle()==Tools.STYLE_LAND||e.getStyle()==Tools.STYLE_START)){ if(gameing_bg.getBgspeed()! =0) player.setIsUpOfPale(true); break; }else{ player.setIsUpOfPale(false); } //判断主角是否在天上的桥之下 if((player.getPosition()[0]>=e.getleftX()&&player .getPosition()[0]+player.getPosition()[2]/2<=e .getEndX())&&e.getStyle()==Tools.STYLE_SKY){ player.setIsPaleOnHead(true,gameMap.getSky_y() +fly_bam_left.getHeight()/2, gameing_bg.getBgspeed()*5); break; }else player.setIsPaleOnHead(false,0,0); //判断主角与左突起的碰撞 if((player.getPosition()[1]+player.getPosition()[3]>=e .getLeftY()+Tools.NINJA_SPEED) &&(player.getPosition()[1]<=e.getLeftY() +bam_left.getHeight()) &&(player.getPosition()[0]+player.getPosition()[2]>=e .getleftX()&&player.getPosition()[0] .getleftX()) &&e.getStyle()==Tools.STYLE_LAND){ if(gameing_bg.getBgspeed()! =0){ player.setIsUpOfPale(false); player.setIsPaleOnHead(false,0,0); player.setStatus(Tools.PLAYERWALK); gameing_bg.setBgspeed(0); gameing_bg.islogic=false; } } //判断主角与桥桩子的碰撞 if((player.getPosition()[1]>=e.getLeftY() +bam_left.getHeight()) &&(player.getPosition()[0]+player.getPosition()[2]>=e .getleftX()+bam_left.getWidth()&&player .getPosition()[0] &&e.getStyle()==Tools.STYLE_LAND){ player.setIsUpOfPale(false); player.setIsPaleOnHead(false,0,0); if(player.getPlayerStatus()! =Tools.PLAYERDART) player.setStatus(Tools.PLAYERWALK); gameing_bg.islogic=false; gameing_bg.setBgspeed(0); //break; } //如果屏幕停止了,但是忍者跳到了木桩之上,则要让屏幕继续移动 if(gameing_bg.getBgspeed()==0 &&(player.getPosition()[1]+player.getPosition()[3]<=e .getLeftY()) &&(player.getPosition()[0]+player.getPosition()[2]<=e .getleftX()+Tools.LATERBGSPEED*3)){ gameing_bg.setBgspeed(Tools.PREBGSPEED*3); gameing_bg.islogic=true; } } if(player.getIsPlayerDead()){ boss=null; GameMusic.playSound(R.raw.dead,0);//播放死亡声效 GameMusic.pauseRun(); GameMusic.pauseSound(Tools.sound_wind); GameMusic.pauseMusic();//暂停游戏中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用软件 课程设计 第二阶段 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)