还剩19页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
计算机学院课程设计专业计算机应用技术课程名称3G开发基础课题名称:台球游戏系统教师:学号:姓名:2013年9月20日——2013年12月25日目录前言Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统早期由原名为“Android”的公司开发,谷歌在2005年收购“Android.Inc”后,继续进行对Android系统开发运营,它采用了软件堆层的架构,主要分为三部分底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张综合本学期的学习,开发一款基于android环境的台球游戏,熟练掌握android应用开发1.课程设计目的
1.1关于java
1、熟悉Java开发环境,熟悉用Java完成一个应用程序的设计过程,掌握有关编辑、调试和整合程序的方法和技巧
2、通过此设计,了解Java语言的特点;熟悉Java程序的编写;体会Java语言在问题求解中的特点
3、总结学习Java语言的心得和体会,并对Java课程设置提出自己的意见和建议
1.2关于android熟悉android开发环境,熟悉用java语言实现一个安卓程序的设计过程,掌握有关的设计技巧
1、熟悉android开发环境,熟悉用java语言实现一个安卓程序的设计过程,掌握有关的设计技巧
2、通过此课程设计,了解android系统的特点,掌握android相关的知识点
3、总结学习android开发环境,熟悉用java语言实现一个安卓程序的设计过程,掌握有关的设计技巧总结学习android的心得和体会,并且android课程提出自己的意见和建议,从中得到自己的学习心得和体会2.设计任务及要求根据android课程学习,将手机台球游戏设计的总体设计框架以及详细的设计和实现过程通老师讲解和自己的理解将其全部以课程设计的方式书写出来3.总体设计框架4.详细设计和实现过程
4.1配置开发环境
1、安装JDK首先将下载的jdk-6u24-windows-i586安装到C:\下
2、配置环境变量选择计算机右键属性高级设置环境变量CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;JAVA_HOME:C:\ProgramFilesx86\Java\jdk
1.
6.0_24Path:%JAVA_HOME%\bin;将以上三个配置到环境变量中
3、安装eclipse双击eclipse快捷方式图标,它会在你选择的路径下生成一个workspace文件夹,以后的项目都在这里面
4、安装ADT离线安装ADT点击eclipse上的help进入如图所示,点击add将ADT导入若安装成功则会出现如图所示的navigate下面手机图标
5、安装SDK点击window进入preference,然后点击android,在SDKLocation中导入SDK,安装成功之后如图所示
4.2功能定义台球游戏是根据人们日常中打台球的模式进行模拟式的通过点击按钮来调准角度并出击球杆选择【开始游戏】之后可选择【倒计时模式】和【练习模式】进行玩台球游戏,另外还可以点击【排行榜】查看分数情况,倒计时模式是在一定的时间进行玩游戏,练习模式是对于初次玩台球游戏的玩家或者不熟练的玩家
4.3类的设计
4.4类的功能各个类功能清单文件名主要功能备注Constant.java定义台球所需工具GameActivity.java主体类Main方法WhatMessage.javaSurface所需的常量类ImageButton.java球杆变形按钮ISwitchButton.javaSwitchButton.java角度调整按钮AboutViewjava关于界面ChoiceView.java选项菜单界面HelpView.java帮助界面SoundControl.java声音控制界面Ball.java台球BallGoThread.java桌球运动Cue.java球杆CueAnimateThread.java倒计时间GameView.java游戏界面GameViewDrawThread.java桌球运动画面KeyThread.java监听触控按键线程类StrengthBar.java力度条Table.java球台Timer.java计时器TimeRunningThread.java倒计时线程类VirtualButton.java虚拟按钮类FailView.java游戏失败界面HighScoreView.java分数记录界面MainMenuView.java主界面WellcomeView.java欢迎界面WinView.java游戏胜利界面CollisionUtil.java进行碰撞检测和物理计算工具类ColorUtil.java颜色工具类DataUtil.java系统当前日期工具类PicLoadUtil.java图片工具类ScreenScaleResult.java横竖屏幕工具类ScreenScaleUtil.java计算缩放情况工具类
4.5类的特点
4.
5.1抽象类WhatMessage的描述publicclassWhatMessage{publicstaticfinalintGOTO_WELLCOME_VIEW=0;//欢迎界面publicstaticfinalintGOTO_MAIN_MENU_VIEW=1;//主菜单界面publicstaticfinalintGOTO_GAME_VIEW=2;//游戏界面publicstaticfinalintGOTO_SOUND_CONTORL_VIEW=3;//声音控制界面publicstaticfinalintGOTO_WIN_VIEW=4;//胜利界面publicstaticfinalintGOTO_FAIL_VIEW=5;//失败界面publicstaticfinalintGOTO_HIGH_SCORE_VIEW=6;//排行榜界面publicstaticfinalintGOTO_HELP_VIEW=7;//帮助界面publicstaticfinalintGOTO_ABOUT_VIEW=8;//关于界面publicstaticfinalintGOTO_CHOICE_VIEW=9;//选择界面publicstaticfinalintOVER_GAME=10;//游戏结束}这个类主要是标识所有SurfaceView的常量,这些界面的常量用数字0至10表示的好处是在后面的编程过程中更快捷,而且简单明了
4.
5.2界面设置publicclassAboutViewextendsViewGroup{Paintpaint;//画笔引用BitmapbgBitmap;//背景图片Bitmapbmp;//文字的图片floatbmpx;//文字位置publicAboutViewGameActivityactivity{superactivity;setWillNotDrawfalse;paint=newPaint;//创建画笔paint.setAntiAliastrue;//打开抗锯齿initBitmap;//初始化位图资源}//确定View的大小@OverrideprotectedvoidonMeasureintwidthMeasureSpecintheightMeasureSpec{this.setMeasuredDimensionbgBitmap.getWidthbgBitmap.getHeight;}//确定各子控件的位置与大小调用子控件的layout函数进行@OverrideprotectedvoidonLayoutbooleanchangedintlinttintrintb{}//显示函数@OverridepublicvoidonDrawCanvascanvas{canvas.drawBitmapbgBitmap00paint;canvas.drawBitmapbmpbmpx+Constant.X_OFFSETConstant.BMP_Y+Constant.Y_OFFSETpaint;}//加载图片的方法publicvoidinitBitmap{bgBitmap=BitmapFactory.decodeResourcethis.getResourcesR.drawable.help;bmp=BitmapFactory.decodeResourcethis.getResourcesR.drawable.bmp0;bgBitmap=PicLoadUtil.scaleToFitFullScreenbgBitmapConstant.wRatioConstant.hRatio;bmp=PicLoadUtil.scaleToFitbmpConstant.ssr.ratio;//初始化图片的位置bmpx=Constant.SCREEN_WIDTH-bmp.getWidth/2;}}界面设置的类继承ViewGroup,使用onMeasure确定view大小、onLayo确定各个子控件的位置与大小,onDraw方法显示函数,initBitmao方法加载图片
4.
5.3监听器publicclassKeyThreadextendsThread{privatebooleanflag=true;GameViewgameView;privateintsleepSpan=40;privatefloatchangeSpeedTime=80f;//改变速度的时间点publicKeyThreadGameViewgameView{this.gameView=gameView;}@Overridepublicvoidrun{whileflag{if!gameView.keyState0x20==0//第6位是1,可以改变按下按钮时间{gameView.btnPressTime+=
3.5f;}if!gameView.keyState0x1==0//和00001按位或,判断第1位是否为1,标志向左移{ifgameView.btnPressTimechangeSpeedTime//如果按键时间不足{gameView.cue.rotateLeftSlowly;//将球杆慢速左转}else//如果按键超过规定时间{gameView.cue.rotateLeftFast;//将大炮快速左转}}elseif!gameView.keyState0x2==0//和00010按位或,判断第2位是否为1,标志向右移{ifgameView.btnPressTimechangeSpeedTime//如果按键时间不足{gameView.cue.rotateRightSlowly;//将球杆慢速右转}else//如果按键超过规定时间{gameView.cue.rotateRightFast;//将大炮快速右转}}try{Thread.sleepsleepSpan;//睡眠指定毫秒数}catchExceptione{e.printStackTrace;//打印堆栈信息}}}publicvoidsetFlagbooleanflag{this.flag=flag;}}这监听器是起监听作用的线程类,这段代码是监听触控按键的线程类,这个线程是对球杆角度偏移进行控制
4.
5.4线程间通信HandlermyHandler=newHandler{//处理各个SurfaceView发送的消息publicvoidhandleMessageMessagemsg{switchmsg.what{caseWhatMessage.GOTO_MAIN_MENU_VIEW:gotoMainMenuView;break;caseWhatMessage.GOTO_GAME_VIEW:gotoGameView;break;caseWhatMessage.GOTO_SOUND_CONTORL_VIEW:gotoSoundControlView;break;caseWhatMessage.GOTO_WIN_VIEW:gotoWinView;break;caseWhatMessage.GOTO_FAIL_VIEW:gotoFailView;break;caseWhatMessage.GOTO_HIGH_SCORE_VIEW:gotoHighScoreView;break;caseWhatMessage.GOTO_WELLCOME_VIEW:gotoWellcomeView;break;caseWhatMessage.GOTO_HELP_VIEW:gotoHelpView;break;caseWhatMessage.GOTO_ABOUT_VIEW:gotoAboutView;break;caseWhatMessage.GOTO_CHOICE_VIEW:gotoChoiceView;break;caseWhatMessage.OVER_GAME:goToOverView;break;}}};线程间的通信需要用到Handler来发送消息线程之间的通信的原理是,线程通过Handler将消息发送出去,发出去的消息就会到进入到MessageQueue中,然后再通过Looper将消息循环的发送出去msg.what是Messge对象的属性,起到标示作用
4.
5.5自定义按钮publicclassImageButtonExextendsButton{protectedBitmapbtBitmap;protectedbooleanbButtonPressed=false;publicImageButtonExContextcontext{supercontext;}publicImageButtonExContextcontextBitmapbtBitmap{supercontext;this.btBitmap=btBitmap;setBackgroundDrawablenull;}自定义按钮的好处是,可以根据自己的喜爱和需要来绘制按钮,可以使你的游戏界面做得更漂亮,吸引大众的眼球在这个游戏中的自定义按钮需要用到图形图像处理中的画布(Canvas)、画笔(Paint)和位图(Bitmap)
4.
5.6定时器//绘制时间的方法publicvoiddrawSelfCanvascanvasPaintpaint{intsecond=this.leftSecond%60;intminute=this.leftSecond/60;//绘制秒钟drawNumberBitmapsecondnumberBitmapsendX+Constant.X_OFFSETendY+Constant.Y_OFFSETcanvaspaint;//绘制分隔符intsecondLength=second+.length=1second+.length+1:second+.length;floatbreakMarkX=endX-secondLength*numberWidth-breakMarkWidth;floatbreakMarkY=endY;canvas.drawBitmapbreakMarkBitmapbreakMarkX+Constant.X_OFFSETbreakMarkY+Constant.Y_OFFSETpaint;//绘制时间分隔符图片//绘制分钟floatminiteEndX=breakMarkX;floatminiteEndY=endY;drawNumberBitmapminutenumberBitmapsminiteEndX+Constant.X_OFFSETminiteEndY+Constant.Y_OFFSETcanvaspaint;}
4.
5.7数据存储//打开或创建数据库的方法publicvoidopenOrCreateDatabase{try{sld=SQLiteDatabase.openDatabase/data/data/com.bn.d
2.bill/mydb//数据库所在路径null//CursorFactorySQLiteDatabase.OPEN_READWRITE|SQLiteDatabase.CREATE_IF_NECESSARY//读写、若不存在则创建;Stringsql=createtableifnotexistshighScore++scoreinteger+datevarchar20+;;sld.execSQLsql;}catchExceptione{Toast.makeTextthis数据库错误+e.toStringToast.LENGTH_SHORT.show;}}//关闭数据库的方法publicvoidcloseDatabase{try{sld.close;}catchExceptione{Toast.makeTextthis数据库错误+e.toStringToast.LENGTH_SHORT.show;;}}//插入记录的方法publicvoidinsertintscoreStringdate{try{Stringsql=insertintohighScorevalues+score++date+;;sld.execSQLsql;sld.close;}catchExceptione{Toast.makeTextthis数据库错误+e.toStringToast.LENGTH_SHORT.show;;}}//查询的方法publicStringqueryintposFromintlength//开始的位置,要查寻的记录条数{StringBuildersb=newStringBuilder;//要返回的结果Cursorcur=null;openOrCreateDatabase;Stringsql=selectscoredatefromhighScoreorderbyscoredesc;;cur=sld.rawQuerysqlnull;try{cur.moveToPositionposFrom;//将游标移动到指定的开始位置intcount=0;//当前查询记录条数whilecur.moveToNextcountlength{intscore=cur.getInt0;Stringdate=cur.getString1;sb.appendscore;sb.append/;sb.appenddate;sb.append/;//将记录用/分隔开count++;}}catchExceptione{Toast.makeTextthis数据库错误+e.toStringToast.LENGTH_SHORT.show;}finally{cur.close;closeDatabase;}//转换成字符,并返回returnsb.toString;}//得到数据库中记录条数的方法publicintgetRowCount{intresult=0;Cursorcur=null;openOrCreateDatabase;try{Stringsql=selectcountscorefromhighScore;;cur=sld.rawQuerysqlnull;ifcur.moveToNext{result=cur.getInt0;}}catchExceptione{Toast.makeTextthis数据库错误+e.toStringToast.LENGTH_SHORT.show;}finally{cur.close;closeDatabase;}returnresult;}这个游戏中的数据存储用到的是SQLite数据库SQLite是一个开源的嵌入式关系数据库,它可以减少应用程序管理数据的开销,可移植性好,很容易使用,它本身很小,但却高效而且可靠嵌入式数据库的一大好处是在程序内部不需要网络配置,也不需要管理使用SQLite数据存储需要熟悉SQL语句的使用使用SQLite数据库首先需要创建数据库,相关记录就会在数据库中
4.
5.8多线程publicvoidrun{forinti=0;itotalSleepTime/sleepSpan;i++{SurfaceHoldermyholder=WinView.this.getHolder;Canvascanvas=myholder.lockCanvas;try{synchronizedmyholder{rendercanvas;}}finally{ifcanvas!=null{myholder.unlockCanvasAndPostcanvas;}}try{Thread.sleepsleepSpan;}catchExceptione{e.printStackTrace;}}该run方法是实现Runnable接口的关键字synchronized用来与对象的互斥锁联系当某个对象用synchronized修饰时,表明该对象在任一时刻只能有一个线程访问当线程执行到synchronized块结束时,需要释放对象锁当在synchronized块中遇到breakreturn或抛出Exception则自动释放对象锁
4.
5.9信息提示Toast.makeTextthis数据库错误+e.toStringToast.LENGTH_SHORT.show;Toast提示是Android中用来显示提示消息的一种机制Toast没有焦点且显示的时间有限,不会打断用户的当前操作,不能与用户交互,显示一段时间后会自动消失显示时长有有两个一个是Toast.LENGTH_SHORT(短时间),另一种是Toast.LENGTH_LONG长时间
4.
5.10布局管理LinearLayoutxmlns:android=http://schemas.android.com/apk/res/androidandroid:orientation=verticalandroid:layout_width=fill_parentandroid:layout_height=fill_parentTextViewandroid:layout_width=fill_parentandroid:layout_height=wrap_contentandroid:text=@string/hello//LinearLayout此次布局用到的是线性布局,排列方式是相对于手机屏幕垂直排布,宽高占满整个手机屏幕,文字大小的高是包裹内容,宽是占满手机屏幕5.设计小结在本次课程设计中,我学到了很多的知识,我个人认为这个台球游戏编程需要一定的物理和数学基础,并且头脑要保持时刻清醒,要不然很容易绕晕在对Android的学习上是我学会了怎么将学到的理论知识用到实践中去,改变了过去的学习方法和学习态度,找到了一门自己很喜欢的学科在这次课程设计中本课程设计中,深深的感受到了一个人力量的单薄,了解到了在完成一个完整的项目上团队的重要性,在实际的程序开发中,团队的力量往往比个人力量之和要大上很多,并且在今后的开发中,我们都将是以团队的形式展开工作的,所以我们应该在现在学习的时候养成一种良好的团队精神,以为将来的开发打下一顶的基础台球游戏欢迎界面开始界面退出帮助设置开始游戏关于倒计时模式练习模式排行榜WhatMessageConstantMainMenuViewGameActivityFailViewHighScoreWellcomeViewWinViewAboutViewChoiceViewHelpViewSoundControlViewBallBallGoThreadCueGameViewGameViewDrawThreadKeyThreadStrengthBarTableTimerTimeRunningThreadVirtualButtonCueAnimateThreadImageButtonExISwitchButtonSwitchButtonCollisionUtilColorUtilPicLoadUtilScreenScaleResultScreenScaleUtil。