版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实习实训手册专业:10嵌入式系统工程实训名称:Android贪吃蛇游戏设计班级:姓名:_________________________学号:指导教师:起止时间:201年代日至201年代日信息工程系Android贪吃蛇游戏设计Android是鉴于Linux开放性内核的操作系统,是Google企业在2007年11月5日公布的手机操作系统。初期由原名为"Android"的企业开发,谷歌在2005年收买"Android.Inc"后,持续对Android系统开发营运,它采纳了软件堆层(softwarestack,别名软件叠层)的架构,主要分为三部分。基层Linux内核只供给基本功能,其余的应用软件则由各企业自行开发,部分程序以Java编写。工程背景说明针对现在游戏开发的流行趋向,手机游戏的设计已成为主流,跟着计算机技术及硬件技术的不断发展,用户的需求量也愈来愈多,而且用户追求的成效也愈来愈好,在此局势下好的设计方法尤其重要,鉴于android系统的手机游戏设计方法简单且效率较高。贪吃蛇游戏也是好多人热中的游戏,用户不单要求其界面设计精巧,更希望操作简单,程序履行速度快。Android支持使用Java作为编程语言来开发应用程序,而Android的Java开发方面从接口到功能,都有层见迭出的变化。考虑到Java虚构机的效率和资源占用,谷歌重新设计了Android的Java,以便能提升效率和减少资源占用,因此与J2ME等不同。操作系统与应用程序的交流桥梁,应用分为两层:函数层(Library)和虚构机(VirtualMachine)。Android的中间层多以Java实现,而且采纳特别的Dalvik虚构机(DalvikVirtualMachine)。Dalvik虚构机是一种“暂存器型态”(RegisterBased)的Java虚构机,变量皆寄存于暂存器中,虚构机的指令相对减少。贪吃蛇游戏是一款老牌的手机游戏,同时也是一款比较需要耐心地游戏。贪吃蛇游戏就是一条小蛇,不断地在屏幕上游走,吃各个方向出现的食品,越吃越长。只需蛇头遇到屏幕周围,或许遇到自己的身子,小蛇就立刻毙命。玩“贪吃蛇游戏”,难度最大的不是蛇长得很长的时候,而是开始的时候。那时蛇身很短,看上去难度不大,却最简单死掉,因为把玩一条小蛇让人简单走神,失掉耐心。Android应用愈来愈宽泛,开发Android游戏也逐渐成为市场的一定,本游戏的开发是鉴于Android1.5系统,采纳eclipse编程实现。时间安排消化资料、系统检查1天系统剖析、整体设计,实行计划5天撰写报告2天演示、查收1天详细要求1、明确课程设计的目的和重要性,仔细领悟课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会怎样运用前修知识与收集、概括有关资料解决详细问题的方法。严格要求自己,要独立思虑,按时、独立达成课程设计任务。2、设计报告:要求层次清楚、整齐规范、不得互相剽窃,凡正文内容有整段完整同样者一律以剽窃论处。设计与实现详细实现过程分为以下3步:工程框架、游戏类图设计、界面设计。○1工程框架新建一个Eclipse工程并命名为Snake,工程以下列图所示:图1.1Snake工程工程中包含4个Activity,分别为Snake(主界面)、Game(游戏界面)、Help(游戏说明界面)、AuthorView(作者信息界面),经过不同Activity之间的变换实现不同界面之间的切换。游戏主界面以下列图所示:图1.2游戏主界面○2游戏类图设计Game(Activity)继承了SnakeView类,SnakeView类继承了TileView类。TileView类继承了View,以下列图所示:Game(Activity)SnakeViewTileViewView图1.3类图TiltView的基类是View,包含了贪吃蛇游戏画面的各个设定参数,主要负责绘制游戏画面。TileView类定义以下:publicclassTileViewextendsView{privatestaticfinalStringtag="yao"。protectedstaticintmTileSize=20。//方格的边长protectedstaticintmXTileCount。//X轴上方格的个数protectedstaticintmYTileCount。//Y轴上方格的个数privatestaticintmXOffset。//画图时X轴上的开端坐标privatestaticintmYOffset。//画图时Y轴上的开端坐标privateBitmap[]mTileArray。//位图数组privateint[][]mTileGrid。//映照整个游戏画面的数组privatefinalPaintmPaint=newPaint( )。//画笔publicTileView(Contextcontext,AttributeSetattrs){super(context,attrs)。Log.i(tag,"TileViewConstructor")。Log.i(tag,"mTileSize="+mTileSize)。}//重置位图数组的长度publicvoidresetTiles(inttilecount){mTileArray=newBitmap[tilecount]。}@Override//适应各样分辨率的屏幕,当改变屏幕大小尺寸时,同时改正tile的有关计数指标protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){Log.i(tag,"onSizeChanged,"+"w="+w+"h="+h+"oldw="+oldw+"oldh="+oldh)。mXTileCount=(int)Math.floor(w/mTileSize)。mYTileCount=(int)Math.floor(h/mTileSize)。Log.i(tag,"mXTileCount="+mXTileCount)。Log.i(tag,"mYTileCount="+mYTileCount)。mXOffset=((w-(mTileSize*mXTileCount))/2)。mYOffset=((h-(mTileSize*mYTileCount))/2)。Log.i(tag,"mXOffset="+mXOffset)。Log.i(tag,"mYOffset="+mYOffset)。mTileGrid=newint[mXTileCount][mYTileCount]。clearTiles( )。}//这里做了一个Drawable到bitmap的变换publicvoidloadTile(intkey,Drawabletile){Bitmapbitmap=Bitmap.createBitmap(mTileSize,mTileSize,Bitmap.Config.ARGB_8888)。Canvascanvas=newCanvas(bitmap)。tile.setBounds(0,0,mTileSize,mTileSize)。tile.draw(canvas)。mTileArray[key]=bitmap。}//清空图形显示publicvoidclearTiles( ){Log.i(tag,"TileView.clearTiles")。for(intx=0。x<mXTileCount。x++){for(inty=0。y<mYTileCount。y++){setTile(0,x,y)。}}}//在相应的坐标地点绘制相应的砖块publicvoidsetTile(inttileindex,intx,inty){mTileGrid[x][y]=tileindex。}onDraw@Override将直接操作的画布绘制得手机界面上publicvoidonDraw(Canvascanvas){Log.i(tag,"onDraw")。super.onDraw(canvas)。Bitmapbmp。floatleft。floattop。for(intx=0。x<mXTileCount。x++){for(inty=0。y<mYTileCount。y++){if(mTileGrid[x][y]>0){bmp=mTileArray[mTileGrid[x][y]]。left=x*mTileSize+mXOffset。top=y*mTileSize+mYOffset。canvas.drawBitmap(bmp,left,top,mPaint)。}}}}}SnakeView类定义了游戏运转时的画面改变及蛇体和果子的更新方法。第一用Handler体制实现准时刷新,代码以下:classRefreshHandlerextendsHandler{//获撤信息并办理@OverridepublicvoidhandleMessage(Messagemsg){SnakeView.this.update( )。SnakeView.this.invalidate( )。//刷新view为基类的界面Log.i(tag,"handleMessage|ThreadName="+Thread.currentThread( ).getName( ))。}//准时发送信息给UI线程,以此达到更新成效publicvoidsleep(longdelayMillis){this.removeMessages(0)。//清空信息行列,Handler进入对新信息的等候Log.i(tag,"sleep|ThreadName="+Thread.currentThread( ).getName( ))。//准时发送新信息,激活handlersendMessageDelayed(obtainMessage(0),delayMillis)。}}。定义SnakeView( )函数初始化游戏,代码以下:publicSnakeView(Contextcontext,AttributeSetattrs){super(context,attrs)。Log.i(tag,"SnakeViewConstructor")。initSnakeView( )。//结构函数中,初始化游戏}定义initSnakeView( )初始化SnakeView类,代码以下:privatevoidinitSnakeView( ){Log.e(tag,"initSnakeView")。//设置焦点,因为存在文字界面和游戏界面的跳转。这个focus是不行或缺的。setFocusable(true)。//获得资源中的图片,加载到砖块词典中。Resourcesr=this.getContext( ).getResources( )。resetTiles(4)。loadTile(RED_STAR,r.getDrawable(R.drawable.redstar))。loadTile(YELLOW_STAR,r.getDrawable(R.drawable.yellowstar))。loadTile(GREEN_STAR,r.getDrawable(R.drawable.greenstar))。}别的还定义了updateWalls( )、updateApples( )、updateSnake( )绘制墙、果子、蛇,以及更新画面函数、保留地点坐标函数等,详细代码请详见目录。○3界面设计界面设计包含游戏主界面(Snake)、作者信息界面、游戏说明界面、游戏界面的设计。界面的设计采纳的是xml文档形式,在xml文档中规划好界面布局布局后,分别在java文件中申明。主界面设计:主界面包含一个TextView、一个imagebutton、三个button,其main.xml文档以下:<?xmlversion="1.0"encoding="utf-8"?><AbsoluteLayoutxmlns:android=""android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/icon"><LinearLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"><TextViewandroid:textColor="#ff3456ff"android:textSize="40sp"android:layout_height="wrap_content"android:visibility="visible"android:text="Snake"android:layout_width="wrap_content"android:id="@+id/text"android:gravity="center_horizontal"></TextView><ImageButtonandroid:visibility="visible"android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/ImageButton1"></ImageButton><Buttonandroid:id="@+id/Button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="visible"></Button><Buttonandroid:id="@+id/Button5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="visible"></Button><Buttonandroid:id="@+id/Button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="visible"></Button></LinearLayout></AbsoluteLayout>其对应的Snake.java文件以下:publicclassSnakeextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState)。setContentView(R.layout.main)。initialstart( )。//初始化}publicvoidinitialstart( ){ImageButtonimageButton=(ImageButton)this.findViewById(R.id.ImageButton1)。Buttonbutton1=(Button)this.findViewById(R.id.Button1)。Buttonbutton3=(Button)this.findViewById(R.id.Button3)。Buttonbutton5=(Button)this.findViewById(R.id.Button5)。button1.setText("作者信息")。button3.setText("退出")。button5.setText("游戏说明")。imageButton.setImageResource(R.drawable.icon1)。//按钮注册到各自的监听器imageButton.setOnClickListener(newView.OnClickListener( ){publicvoidonClick(Viewview){Intentintent=newIntent( )。intent.setClass(Snake.this,Game.class)。startActivity(intent)。//跳转到Game界面Snake.this.finish( )。}})。button1.setOnClickListener(newView.OnClickListener( ){publicvoidonClick(Viewview){//setContentView(R.layout.author)。Intentintent=newIntent( )。intent.setClass(Snake.this,AuthorView.class)。startActivity(intent)。//跳转到作者信息界面Snake.this.finish( )。//注销跳转以前的界面}})。button3.setOnClickListener(newView.OnClickListener( ){publicvoidonClick(Viewview){Snake.this.finish( )。//退出应用程序}})。button5.setOnClickListener(newView.OnClickListener( ){publicvoidonClick(Viewview){Intentintent=newIntent( )。intent.setClass(Snake.this,Help.class)。startActivity(intent)。//跳转到游戏说明界面Snake.this.finish( )。}})。}}游戏界面设计:游戏界面包含一个button,一个,其game.xml文档以下:<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns:android=""android:layout_width="fill_parent"android:layout_height="fill_parent">android:id="@+id/snake"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/background"/><RelativeLayoutandroid:layout_height="fill_parent"android:id="@+id/relativeLayout1"android:layout_width="fill_parent"><TextViewandroid:layout_width="wrap_content"android:textColor="#ff8888ff"android:textSize="24sp"android:visibility="visible"android:text="开始"android:layout_centerInParent="true"android:id="@+id/text"android:layout_height="wrap_content"android:gravity="center_horizontal"></TextView><Buttonandroid:layout_width="wrap_content"android:text="返回"android:id="@+id/button4"android:layout_height="wrap_content"android:layout_alignParentBottom="true"></Button></RelativeLayout></FrameLayout>相对应的Game.java文件以下:publicclassGameextendsActivity{//定义游戏参数privateSnakeViewmSnakeView。privatestaticStringICICLE_KEY="snake-view"。privateintmMode=READY。publicstaticfinalintPAUSE=0。publicstaticfinalintREADY=1。publicstaticfinalintRUNNING=2。publicstaticfinalintLOSE=3。@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState)。setContentView(R.layout.game)。mSnakeView=(SnakeView)findViewById(R.id.snake)。//设置界面背景mSnakeView.setBackgroundResource(R.drawable.background)。TextViewtv=(TextView)findViewById(R.id.text)。Buttonbutton4=(Button)this.findViewById(R.id.button4)。//依据TextView状态判断能否开始游戏mSnakeView.setStatusTextView(tv)。if(savedInstanceState==null){mSnakeView.setMode(SnakeView.READY)。}else{Bundlebundle=savedInstanceState.getBundle(ICICLE_KEY)。if(bundle!=null){mSnakeView.restoreState(bundle)。}else{mSnakeView.setMode(SnakeView.PAUSE)。}}//按钮注册到监听器button4.setOnClickListener(newView.OnClickListener( ){publicvoidonClick(Viewview){Intentintent=newIntent( )。intent.setClass(Game.this,Snake.class)。startActivity(intent)。Game.this.finish( )。}})。}//设置键盘监听事件,若按下UP键则开始游戏publicbooleanonKeyDown(intkeyCode,KeyEventmsg){if(keyCode==KeyEvent.KEYCODE_DPAD_UP){if(mMode==READY|mMode==LOSE){mSnakeView.initNewGame( )。mSnakeView.setMode(RUNNING)。mSnakeView.update( )。return(true)。}}returnsuper.onKeyDown(keyCode,msg)。}//判断游戏状态能否为暂停protectedvoidonPause( ){super.onPause( )。PausethegamealongwiththeactivitymSnakeView.setMode(SnakeView.PAUSE)。}@Override//保留事件状态publicvoidonSaveInstanceState(BundleoutState){outState.putBundle(ICICLE_KEY,mSnakeView.saveState( ))。}}作者信息界面设计:此界面包含一个TextView、一个button,其author.xml文档以下:<?xmlversion="1.0"encoding="utf-8"?><ScrollViewxmlns:android=""android:layout_x="0dip"android:id="@+id/scrollView1"android:background="@drawable/background1"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_y="4dip"><AbsoluteLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:id="@+id/text"android:text="姓名:林杰性别:男学院:交通学院"android:visibility="visible"android:layout_width="wrap_content"android:layout_height="wrap_content"android:scrollbars="vertical"android:textSize="34dip"/><Buttonandroid:layout_width="wrap_content"android:text="返回"android:visibility="visible"android:layout_height="wrap_content"android:id="@+id/Button2"android:layout_x="269dip"android:layout_y="322dip"></Button></AbsoluteLayout></ScrollView>相对应的AuthorView.java文件以下:publicclassAuthorViewextendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState)。setContentView(R.layout.author)。Buttonbutton2=(Button)this.findViewById(R.id.Button2)。//按钮注册到监听器button2.setOnClickListener(newView.OnClickListener( ){publicvoidonClick(Viewview){Intentintent=newIntent( )。intent.setClass(AuthorView.this,Snake.class)。//跳转到主界面startActivity(intent)。//注销目前界面AuthorView.this.finish( )。}})。}}游戏说明界面设计:此界面包含一个TextView、一个button,其help.xml文档以下:<?xmlversion="1.0"encoding="utf-8"?><ScrollViewxmlns:android=""android:layout_x="0dip"android:id="@+id/scrollView1"android:background="@drawable/background2"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_y="4dip"><AbsoluteLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><Buttonandroid:layout_width="wrap_content"android:text="返回"android:visibility="visible"android:layout_height="wrap_content"android:id="@+id/Button6"android:layout_x="272dip"android:layout_y="244dip"></Button><TextViewandroid:textSize="34dip"android:visibility="visible"android:layout_width="wrap_content"android:scrollbars="vertical"android:text="游戏中按键盘UP键蛇向上按DOWN键向下按LEFT键向左按RIGHT键向右"android:layout_height="wrap_content"android:id="@+id/text"android:layout_x="-1dip"android:layout_y="50dip"></TextView></AbsoluteLayout></ScrollView>相对应的Help.java文件以下:publicclassHelpextendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState)。setContentView(R.layout.help)。Buttonbutton6=(Button)this.findViewById(R.id.Button6)。//按钮注册到监听器button6.setOnClickListener(newView.OnClickListener( ){publicvoidonClick(Viewview){Intentintent=newIntent( )。intent.setClass(Help.this,Snake.class)。//跳转到主界面startActivity(intent)。//注销目前界面Help.this.finish( )。}})。}}至此,所有界面设计达成,但还有最重要的一步,就是将所有的Activity注册到AndroidManifest.xml中。AndroidManifest.xml文档以下:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android=""package="my.game.snake"android:versionCode="1"android:versionName="1.0"><applicationandroid:icon="@drawable/icon"android:label="@string/app_name"><activityandroid:name=".Snake"android:label="@string/app_name"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity><activityandroid:name=".AuthorView"></activity><activityandroid:name=".Game"></activity><activityandroid:name=".Help"></activity></application><uses-sdkandroid:minSdkVersion="3"/></manifest>此外strings.xml中定义了常量字符,文档以下:<?xmlversion="1.0"encoding="utf-8"?><resources><stringname="hello">HelloWorld,Snake!</string><stringname="app_name">Snake</string><stringname="mode_ready">贪吃蛇\n按两次“向上”键开始"</string><stringname="mode_pause">暂停中\n按“向上”键恢复</string><stringname="mode_lose_prefix">游戏结束\n得分:</string><stringname="mode_lose_suffix">\n按“向上”键开始\n按“返回”按钮退出游戏</string><stringname="snake_layout_text_text"></string></resources>至此,贪吃蛇游戏设计完成。工程演示程序运转成效图以下:图3.1进入Snake应用程序图3.2游戏主界面图3.3游戏开始界面图3.4游戏运转界面图3.5游戏结束界面因为波及到个人信息,因此未给出截图图3.6作者信息界面图3.7游戏说明界面小结本课程的设计的目的是经过实践使同学们经历面向对象全过程和遇到一次综合训练,以便能较全面地理解、掌握和综合运用所学的知识。联合详细的开发事例,理解并初步掌握系统剖析、系统设计、系统实行的主要环节和步骤以及软件文档的制作能力。附录TileView.javapackage。import。import。import。import。import。import。import。import。publicclassTileViewextendsView{privatestaticfinalStringtag="yao"。protectedstaticintmTileSize=20。//方格的边长protectedstaticintmXTileCount。//X轴上方格的个数protectedstaticintmYTileCount。//Y轴上方格的个数privatestaticintmXOffset。//画图时X轴上的开端坐标privatestaticintmYOffset。//画图时Y轴上的开端坐标privateBitmap[]mTileArray。//位图数组privateint[][]mTileGrid。//映照整个游戏画面的数组privatefinalPaintmPaint=newPaint( )。//画笔publicTileView(Contextcontext,AttributeSetattrs){super(context,attrs)。Log.i(tag,"TileViewConstructor")。Log.i(tag,"mTileSize="+mTileSize)。}//重置位图数组的长度publicvoidresetTiles(inttilecount){mTileArray=newBitmap[tilecount]。}@Override//适应各样分辨率的屏幕,当改变屏幕大小尺寸时,同时改正tile的有关计数指标protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){Log.i(tag,"onSizeChanged,"+"w="+w+"h="+h+"oldw="+oldw+"oldh="+oldh)。mXTileCount=(int)Math.floor(w/mTileSize)。mYTileCount=(int)Math.floor(h/mTileSize)。Log.i(tag,"mXTileCount="+mXTileCount)。Log.i(tag,"mYTileCount="+mYTileCount)。mXOffset=((w-(mTileSize*mXTileCount))/2)。mYOffset=((h-(mTileSize*mYTileCount))/2)。Log.i(tag,"mXOffset="+mXOffset)。Log.i(tag,"mYOffset="+mYOffset)。mTileGrid=newint[mXTileCount][mYTileCount]。clearTiles( )。}//这里做了一个Drawable到bitmap的变换publicvoidloadTile(intkey,Drawabletile){Bitmapbitmap=Bitmap.createBitmap(mTileSize,mTileSize,Bitmap.Config.ARGB_8888)。Canvascanvas=newCanvas(bitmap)。tile.setBounds(0,0,mTileSize,mTileSize)。tile.draw(canvas)。mTileArray[key]=bitmap。}//清空图形显示publicvoidclearTiles( ){Log.i(tag,"TileView.clearTiles")。for(intx=0。x<mXTileCount。x++){for(inty=0。y<mYTileCount。y++){setTile(0,x,y)。}}}//在相应的坐标地点绘制相应的砖块publicvoidsetTile(inttileindex,intx,inty){mTileGrid[x][y]=tileindex。}onDraw@Override将直接操作的画布绘制得手机界面上publicvoidonDraw(Canvascanvas){Log.i(tag,"onDraw")。super.onDraw(canvas)。Bitmapbmp。floatleft。floattop。for(intx=0。x<mXTileCount。x++){for(inty=0。y<mYTileCount。y++){if(mTileGrid[x][y]>0){bmp=mTileArray[mTileGrid[x][y]]。left=x*mTileSize+mXOffset。top=y*mTileSize+mYOffset。canvas.drawBitmap(bmp,left,top,mPaint)。}}}}}SnakeView.java。。。。。。。。。。。。。publicclassSnakeViewextendsTileView{privatestaticfinalStringtag="yao"。privateintmMode=READY。//游戏的四种状态publicstaticfinalintPAUSE=0
。publicstaticfinalintREADY=1
。publicstaticfinalintRUNNING=2。publicstaticfinalintLOSE=3。//蛇体运动的方向辨别privateintmDirection=NORTH。privateintmNextDirection=NORTH。privatestaticfinalintNORTH=1。privatestaticfinalintSOUTH=2。privatestaticfinalintEAST=3。privatestaticfinalintWEST=4。//游戏中仅有的三种砖块对应的数值privatestaticfinalintRED_STAR=1。privatestaticfinalintYELLOW_STAR=2。privatestaticfinalintGREEN_STAR=3。privatelongmScore=0。//记录获取的分数privatelongmMoveDelay=600。//每挪动一步的延时。初始时设置为600msprivatelongmLastMoveTime。privateTextViewmStatusTextView。//用来显示游戏状态的
TextView//两个链表,分别用来储存蛇体和果子的坐标privateArrayList<Coordinate>mSnakeTrail=newArrayList<Coordinate>( )
。privateArrayList<Coordinate>mAppleList=newArrayList<Coordinate>( )
。//随机数生成器privatestaticfinalRandomRNG=newRandom( )
。//用Handler体制实现准时刷新privateRefreshHandlermRedrawHandler=newRefreshHandler( )classRefreshHandlerextendsHandler{
。//获撤信息并办理@OverridepublicvoidhandleMessage(Messagemsg){SnakeView.this.update( )。SnakeView.this.invalidate( )。//刷新view为基类的界面Log.i(tag,"handleMessage|ThreadName="+Thread.currentThread( ).getName( ))。}//准时发送信息给UI线程,以此达到更新成效publicvoidsleep(longdelayMillis){this.removeMessages(0)。//清空信息行列,Handler进入对新信息的等候Log.i(tag,"sleep|ThreadName="+Thread.currentThread( ).getName( ))。//准时发送新信息,激活handlersendMessageDelayed(obtainMessage(0),delayMillis)。}}。publicSnakeView(Contextcontext,AttributeSetattrs){super(context,attrs)。Log.i(tag,"SnakeViewConstructor")。initSnakeView( )。//结构函数中,初始化游戏}//初始化SnakeView类,注意,这根初始化游戏是不同样的。privatevoidinitSnakeView( ){Log.e(tag,"initSnakeView")。//设置焦点,因为存在文字界面和游戏界面的跳转。这个focus是不行或缺的。setFocusable(true)。//获得资源中的图片,加载到砖块词典中。Resourcesr=this.getContext( ).getResources( )。resetTiles(4)。loadTile(RED_STAR,r.getDrawable(R.drawable.redstar))。loadTile(YELLOW_STAR,r.getDrawable(R.drawable.yellowstar))。loadTile(GREEN_STAR,r.getDrawable(R.drawable.greenstar))。}//更新游戏状态publicvoidsetMode(intnewMode){intoldMode=mMode。mMode=newMode。Resourcesres=getContext( ).getResources( )。CharSequencestr=""。if(newMode==RUNNING&oldMode!=RUNNING){mStatusTextView.setVisibility(View.INVISIBLE)。update( )。return。}if(newMode==PAUSE){str=res.getText(R.string.mode_pause)。}if(newMode==READY){str=res.getText(R.string.mode_ready)。}if(newMode==LOSE){str=res.getString(R.string.mode_lose_prefix)+mScore+res.getString(R.string.mode_lose_suffix)。}mStatusTextView.setText(str)。mStatusTextView.setVisibility(View.VISIBLE)。}//绑定到相应的textviewpublicvoidsetStatusTextView(TextViewnewView){mStatusTextView=newView。}//按键的监听publicbooleanonKeyDown(intkeyCode,KeyEventmsg){if(keyCode==KeyEvent.KEYCODE_DPAD_UP){if(mMode==READY|mMode==LOSE){initNewGame( )。setMode(RUNNING)。update( )。return(true)。}if(mMode==PAUSE){setMode(RUNNING)。update( )。return(true)。}if(mDirection!=SOUTH){mNextDirection=NORTH。}return(true)。}if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){if(mDirection!=NORTH){mNextDirection=SOUTH。}return(true)。}if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){if(mDirection!=EAST){mNextDirection=WEST。}return(true)。}if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){if(mDirection!=WEST){mNextDirection=EAST。}return(true)。}returnsuper.onKeyDown(keyCode,msg)。}//刷新游戏状态。每次游戏画面的更新、游戏数据的更新,都是依赖这个update( )来达成的publicvoidupdate( ){if(mMode==RUNNING){longnow=System.currentTimeMillis( )。if(now-mLastMoveTime>mMoveDelay){//clearTiles( )。updateWalls( )。updateSnake( )。updateApples( )。mLastMoveTime=now。}mRedrawHandler.sleep(mMoveDelay)。}}//用setTile绘制墙壁privatevoidupdateWalls( ){Log.i(tag,"updateWalls")。for(intx=0。x<mXTileCount。x++){setTile(GREEN_STAR,x,0)。setTile(GREEN_STAR,x,mYTileCount-1)。}for(inty=1。y<mYTileCount-1。y++){setTile(GREEN_STAR,0,y)。setTile(GREEN_STAR,mXTileCount-1,y)。}}//绘制果子privatevoidupdateApples( ){Log.i(tag,"updateApples")。for(Coordinatec:mAppleList){setTile(YELLOW_STAR,c.x,c.y)。}}//更新蛇体privatevoidupdateSnake( ){//吃过果子的蛇会长长。这个变量即为它的标志。booleangrowSnake=false。//头部很重要,只有头部可能遇到果子。Coordinatehead=mSnakeTrail.get(0)。//蛇下一步必定会前移,也就试newHead。长长只会从尾部增添。CoordinatenewHead=newCoordinate(1,1)。mDirection=mNextDirection。switch(mDirection){caseEAST:{newHead=newCoordinate(head.x+1,head.y)。break。}caseWEST:{newHead=newCoordinate(head.x-1,head.y)。break。}caseNORTH:{newHead=newCoordinate(head.x,head.y-1)。break。}caseSOUTH:{newHead=newCoordinate(head.x,head.y+1)。break。}}if((newHead.x<1)||(newHead.y<1)||(newHead.x>mXTileCount-2)(newHead.y>mYTileCount-2)){setMode(LOSE)。return。}intsnakelength=mSnakeTrail.size( )。for(intsnakeindex=0。snakeindex<snakelength。snakeindex++){Coordinatec=mSnakeTrail.get(snakeindex)。if(c.equals(newHead)){setMode(LOSE)。return。}}intapplecount=mAppleList.size( )。for(intappleindex=0。appleindex<applecount。appleindex++){Coordinatec=mAppleList.get(appleindex)。if(c.equals(newHead)){mAppleList.remove(c)。addRandomApple( )。mScore++。mMoveDelay*=0.9。growSnake=true。}}mSnakeTrail.add(0,newHead)。if(!growSnake){mSnakeTrail.remove(mSnakeTrail.size( )-1)。}intindex=0。for(Coordinatec:mSnakeTrail){if(index==0){setTile(YELLOW_STAR,c.x,c.y)。}else{setTile(RED_STAR,c.x,c.y)。}index++。}}//这是坐标点的类,很简单的储存XY坐标privateclassCoordinate{publicintx。publicinty。publicCoordinate(intnewX,intnewY){x=newX。y=newY。}publicbooleanequals(Coordinateother){if(x==other.x&&y==other.y){returntrue。}returnfalse。}@OverridepublicStringtoString( ){return"Coordinate:["+x+","+y+"]"
。}}//在地图上随机的增添果子privatevoidaddRandomApple( ){CoordinatenewCoord=null。booleanf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公共场所安全
- 大学职业规划设计
- 乳腺护理教学方案设计
- 高科技企业运营总监聘用合同
- 食品安全监管招投标实施条例
- 建筑供气承揽施工合同
- 城市规划浮雕施工合同
- 茶馆花园施工合同模板
- 医疗器械保养指南
- 水产养殖招投标部操作流程研究
- 环境影响评价报告模板
- 《UI设计》课件-1.4 UI设计的原则
- 劳动:学做中医药香囊(教案)五年级上册综合实践活动劳动课程通用版
- 腹腔镜下肾切除术手术配合-课件
- 国开电大本科《人文英语4》机考真题(第十二套)
- 超声波清洗机验证方案
- 初中英语- It's important to get enough sleep.2a教学课件设计
- 2023年四川省公需科目(数字经济与驱动发展)考试题库及答案
- 安徽泰亨特科技有限公司年产25000吨四氢噻吩产品建设项目环境影响报告书
- 有坎宽顶堰流量系数侧收缩系数淹没系数确定
- 乔治华盛顿介绍George Washington
评论
0/150
提交评论