您好,欢迎访问三七文档
noPainnoGainnoGavin博客同步更新至:://blog.csdn.net/deabowaySnake也是一个经典游戏了,Nokia蓝屏机的王牌游戏之一。AndroidSDK1.5就有了它的身影。我们这里就来详细解析一下AndroidSDKSample中的Snake工程。本工程基于SDK2.3.3版本中的工程,路径为:%Android_SDK_HOME%/samples/android-10/Snake一、Eclipse工程通过File-NewProject-Android-AndroidProject,选择“Createprojectfromexistingsample”创建自己的应用SnakeAndroid,如下图:运行效果如下图:1noPainnoGainnoGavin博客同步更新至:://blog.csdn.net/deaboway二、工程结构和类图其实Snake的工程蛮简单的,源文件就三个:Snake.javaSnakeView.javaTileView.java。Snake类是这个游戏的入口点,TitleView类进行游戏的绘画,SnakeView类则是对游戏控制操作的处理。Coordinate,RefreshHandler是2个辅助类,也是SnakeView类中的内部类。其中,Coordinate是一个点的坐标(x,y),RefreshHandler将RefreshHandler对象绑定某个线程并给它发送消息。如下图:任何游戏都需要有个引擎来推动游戏的运行,最简化的游戏引擎就是:在一个线程中While循环,检测用户操作,对用户的操作作出反应,更新游戏的界面,直到用户退出游戏。在Snake这个游戏中,辅助类RefreshHandler继承自Handler,用来把RefreshHandler与当前线程进行绑定,从而可以直接给线程发送消息并处理消息。注意一点:Handle对消息的处理都是异步。RefreshHandler在Handler的基础上增2noPainnoGainnoGavin博客同步更新至:://blog.csdn.net/deaboway加sleep()接口,用来每隔一个时间段后给当前线程发送一个消息。handleMessage()方法在接受消息后,根据当前的游戏状态重绘界面,运行机制如下:这比较类似定时器的概念,在特定的时刻发送消息,根据消息处理相应的事件。update()与sleep()间接的相互调用就构成了一个循环。这里要注意:mRedrawHandle绑定的是Avtivity所在的线程,也就是程序的主线程;另外由于sleep()是个异步函数,所以update()与sleep()之间的相互调用才没有构成死循环。最后分析下游戏数据的保存机制,如下:3noPainnoGainnoGavin博客同步更新至:://blog.csdn.net/deaboway这里考虑了Activity的生命周期:如果用户在游戏期间离开游戏界面,游戏暂停;或者由于内存比较紧张,Android关闭游戏释放内存,那么当用户返回游戏界面的时候恢复到上次离开时的界面。三、源码解析详细解析下源代码,由于代码量不大,以注释的方式列出如下:1、Snake.java/***pTitle:Snake/p*pCopyright:(C)2007TheAndroidOpenSourceProject.LicensedundertheApacheLicense,Version2.0(theLicense)/p*@authorGavin标注*/packagecom.deaboway.snake;importandroid.app.Activity;4noPainnoGainnoGavin博客同步更新至:://blog.csdn.net/deabowayimportandroid.os.Bundle;importandroid.widget.TextView;/***Snake:asimplegamethateveryonecanenjoy.**ThisisanimplementationoftheclassicGameSnake,inwhichyoucontrola*serpentroamingaroundthegardenlookingforapples.Becareful,though,*becausewhenyoucatchone,notonlywillyoubecomelonger,butyou'llmove*faster.Runningintoyourselforthewallswillendthegame.**///贪吃蛇:经典游戏,在一个花园中找苹果吃,吃了苹果会变长,速度变快。碰到自己和墙就挂掉。publicclassSnakeextendsActivity{privateSnakeViewmSnakeView;privatestaticStringICICLE_KEY=snake-view;/***CalledwhenActivityisfirstcreated.Turnsoffthetitlebar,setsup*thecontentviews,andfiresuptheSnakeView.**///在activity第一次创建时被调用@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.snake_layout);mSnakeView=(SnakeView)findViewById(R.id.snake);mSnakeView.setTextView((TextView)findViewById(R.id.text));//检查存贮状态以确定是重新开始还是恢复状态if(savedInstanceState==null){//存储状态为空,说明刚启动可以切换到准备状态mSnakeView.setMode(SnakeView.READY);}else{//已经保存过,那么就去恢复原有状态Bundlemap=savedInstanceState.getBundle(ICICLE_KEY);if(map!=null){//恢复状态mSnakeView.restoreState(map);5noPainnoGainnoGavin博客同步更新至:://blog.csdn.net/deaboway}else{//设置状态为暂停mSnakeView.setMode(SnakeView.PAUSE);}}}//暂停事件被触发时@OverrideprotectedvoidonPause(){super.onPause();//PausethegamealongwiththeactivitymSnakeView.setMode(SnakeView.PAUSE);}//状态保存@OverridepublicvoidonSaveInstanceState(BundleoutState){//存储游戏状态到View里outState.putBundle(ICICLE_KEY,mSnakeView.saveState());}}2、SnakeView.java/***pTitle:Snake/p*pCopyright:(C)2007TheAndroidOpenSourceProject.LicensedundertheApacheLicense,Version2.0(theLicense)/p*@authorGavin标注*/packagecom.deaboway.snake;importjava.util.ArrayList;importjava.util.Random;importandroid.content.Context;importandroid.content.res.Resources;importandroid.os.Handler;importandroid.os.Message;importandroid.util.AttributeSet;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.KeyEvent;importandroid.view.View;6noPainnoGainnoGavin博客同步更新至:://blog.csdn.net/deabowayimportandroid.widget.TextView;/***SnakeView:implementationofasimplegameofSnake***/publicclassSnakeViewextendsTileView{privatestaticfinalStringTAG=Deaboway;/***Currentmodeofapplication:READYtorun,RUNNING,oryouhavealready*lost.staticfinalintsareusedinsteadofanenumforperformance*reasons.*///游戏状态,默认值是准备状态privateintmMode=READY;//游戏的四个状态暂停准备运行和失败publicstaticfinalintPAUSE=0;publicstaticfinalintREADY=1;publicstaticfinalintRUNNING=2;publicstaticfinalintLOSE=3;//游戏中蛇的前进方向,默认值北方privateintmDirection=NORTH;//下一步的移动方向,默认值北方privateintmNextDirection=NORTH;//游戏方向设定北南东西privatestaticfinalintNORTH=1;privatestaticfinalintSOUTH=2;privatestaticfinalintEAST=3;privatestaticfinalintWEST=4;/***LabelsforthedrawablesthatwillbeloadedintotheTileViewclass*///三种游戏元privatestaticfinalintRED_STAR=1;privatestaticfinalintYELLOW_STAR=2;privatestaticfinalintGREEN_STAR=3;/***mScore:usedtotrackthenumberofapplescapturedmMoveDelay:numberof7noPainnoGainnoGavin博客同步更新至:://blog.csdn.net/deaboway*millisecondsbetweensnakemovements.Thiswilldecreaseasapplesare*captured.*///游戏得分privatelongmScore=0;//移动延迟privatelongmMoveDelay=600;/***mLastMove:trackstheabsolutet
本文标题:【贪吃蛇―Java程序员写Android游戏】系列 1.Android SDK Sample-Sna
链接地址:https://www.777doc.com/doc-4876755 .html