 
         
         
         
         
         下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Android游戏开发之旅一长按Button原理今天Android123开始新的Android游戏开发之旅系列,主要从控制方法(按键、轨迹球、触屏、重力感应、摄像头、话筒气流、光线亮度卜图形View(高效绘图技术如双缓冲卜音效(游戏音乐)以及最后的OpenGLES(Java层)和NDK的OpenGL和J2ME游戏移植到Android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在AndroidOpenGL如何使用MD2文件,个部分讲述下Android游戏开发的过程最终实现一个比较完整的游戏引擎。相信大家都清楚AndroidMarket下载量比较好的都是游戏,未来手机网游的发展相信Andr
2、oid使用的Java在这方面有比iPhone有更低的入门门槛。对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合AndroidButton模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类publicclassRepeatingImageButtonextendsImageButtonprivatelongmStartTime;/记录长按开始privateintmRepeatCount;/重复次数计数privateRepeatListenermListener;privatelon
3、gmInterval=500;/Timer触发间隔,即每0.5秒算一次按下publicRepeatingImageButton(Contextcontext)this(context,null);publicRepeatingImageButton(Contextcontext,AttributeSetattrs)this(context,attrs,android.R.attr.imageButtonStyle);publicRepeatingImageButton(Contextcontext,AttributeSetattrs,intdefStyle)super(context,attr
4、s,defStyle);setFocusable(true);/允许获得焦点setLongClickable(true);/启用长按事件publicvoidsetRepeatListener(RepeatListenerl,longinterval)/实现重复按下事件listenermListener=l;mInterval=interval;OverridepublicbooleanperformLongClick()mStartTime=SystemClock.elapsedRealtime();mRepeatCount=0;post(mRepeater);returntrue;Overr
5、idepublicbooleanonTouchEvent(MotionEventevent)if(event.getAction()=MotionEvent.ACTION_UP)/本方法原理同onKeyUp的一样,这里处理屏幕事件,下面的onKeyUp处理Android手机上的物理按键事件removeCallbacks(mRepeater);if(mStartTime!=0)doRepeat(true);mStartTime=0;)returnsuper.onTouchEvent(event);)/处理导航键事件的中键或轨迹球按下事件OverridepublicbooleanonKeyDown
6、(intkeyCode,KeyEventevent)switch(keyCode)caseKeyEvent.KEYCODE_DPAD_CENTER:caseKeyEvent.KEYCODE_ENTER:super.onKeyDown(keyCode,event);returntrue;)returnsuper.onKeyDown(keyCode,event);)/当按键弹起通知长按结束OverridepublicbooleanonKeyUp(intkeyCode,KeyEventevent)switch(keyCode)caseKeyEvent.KEYCODE_DPAD_CENTER:case
7、KeyEvent.KEYCODE_ENTER:removeCallbacks(mRepeater);/取消重复listener捕获if(mStartTime!=0)doRepeat(true);/如果长按事件累计时间不为0则说明长按了mStartTime=0;/重置长按计时器)returnsuper.onKeyUp(keyCode,event);)privateRunnablemRepeater=newRunnable()/在线程中判断重复publicvoidrun()doRepeat(false);if(isPressed()postDelayed(this,mInterval);/计算长按
8、后延迟下一次累加);privatevoiddoRepeat(booleanlast)longnow=SystemClock.elapsedRealtime();if(mListener!=null)mListener.onRepeat(this,now-mStartTime,last?-1:mRepeatCount+);)下面是重复ButtonListener接口的定义,调用时在Button中先使用setRepeatListener()方法实现RepeatListener接口publicinterfaceRepeatListenervoidonRepeat(Viewv,longduration
9、,intrepeatcount);/参数为用户传入的Button对象,参数二为延迟的毫秒数,第三位重复次数回调。)Android游戏开发之旅二View和SurfaceView在Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas来实现这些,而GoogleAndroid中涉及到显示的为view类,Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理。这里我们说下android.view.View和android.view.SurfaceView。SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceVi
10、ew和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView,到底有哪些优势呢?SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的有CanvaslockCanvas()CanvaslockCanvas(Rectdirty)、voidremoveCallback(SurfaceHolder.Callbackcallback)、voidunlockCanvasAndPost(Canvascanvas)控制图形以及绘制,而在SurfaceHolder.C
11、allback接口回调中可以通过下面三个抽象类可以自己定义具体的实现,比如第一个更改格式和显示画面。abstractvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight)abstractvoidsurfaceCreated(SurfaceHolderholder)abstractvoidsurfaceDestroyed(SurfaceHolderholder)对于Surface相关的,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建,同时A
12、ndroid123未来后面说到的OpenGL中的GLSurfaceView也是从该类实现。Android游戏开发之旅三View类详解在Android游戏开发之旅二中我们讲到了View和SurfaceView的区别,今天Android123从View类开始着重的介绍Android图形显示基类的相关方法和注意点。自定义View的常用方法:onFinishInflate()当View中所有的子控件均被映射成xml后触发onMeasure(int,int)确定所有子元素的大小onLayout(boolean,int,int,int,int)当View分配所有的子元素的大小和位置时触发onSizeCha
13、nged(int,int,int,int)当view的大小发生变化时触发onDraw(Canvas)view渲染内容的细节onKeyDown(int,KeyEvent)有按键按下后触发onKeyUp(int,KeyEvent)有按键按下后弹起时触发onTrackballEvent(MotionEvent)轨迹球事件onTouchEvent(MotionEvent)触屏事件onFocusChanged(boolean,int,Rect)当View获取或失去焦点时触发onWindowFocusChanged(boolean)当窗口包含的view获取或失去焦点时触发onAttachedToWindo
14、w()当view被附着到一个窗口时触发onDetachedFromWindow()当view离开附着的窗口时触发,Android123提示该方法和onAttachedToWindow()是相反的。onWindowVisibilityChanged(int)当窗口中包含的可见的view发生变化时触发以上是View实现的一些基本接口的回调方法,一般我们需要处理画布的显示时,重写onDraw(Canvas)用的的是最多的:OverrideprotectedvoidonDraw(Canvascanvas)Paint来选择要填充的颜色/这里我们直接使用canvas对象处理当前的画布,比如说使用Paint
15、paintBackground=newPaint();paintBackground.setC010r(getResources().getC010r(R.color.xxx);从Res中找到名为xxx的color颜色定义canvas.drawRect(0,0,getWidth(),getHeight(),paintBackground);/设置当前画布的背景颜色为paintBackground中定义的颜色,以0,0作为为起点,以当前画布的宽度和高度为重点即整块画布来填充。具体的请查看Android123未来讲到的Canvas和Paint,在Canvas中我们可以实现画路径,图形,区域,线。而
16、Paint作为绘画方式的对象可以设置颜色,大小,甚至字体的类型等等。当然还有就是处理窗口还原状态问题(一般用于横竖屏切换),除了在Activity中可以调用外,开发游戏时我们尽量在View中使用类似OverrideprotectedParce1ab1eonSaveInstanceState()Parce1ab1ep=super.onSaveInstanceState();Bund1ebund1e=newBund1e();bundle.putInt(x,pX);bundle.putInt(y,pY);bundle.putParcelable(android123_state,p);returnb
17、und1e;OverrideprotectedvoidonRestoreInstanceState(Parcelablestate)Bund1ebund1e=(Bund1e)state;dosomething(bundle.getInt(x),bundle.getInt(y);/获取刚才存储的x和y信息super.onRestoreInstanceState(bundle.getParcelable(android123_state);return;在View中如果需要强制调用绘制方法onDraw,可以使用invalidate()方法,它有很多重载版本,同时在线程中的postInvailida
18、te()方法将在Android游戏开发之旅六中的自定义View完整篇讲到。Android游戏开发之旅四Canvas和Paint实例昨天我们在Android游戏开发之旅三View详解中提到了onDraw方法,有关详细的实现我们今天主要说下Android的Canvas和Paint对象的使用实例。Canvas类主要实现了屏幕的绘制过程,其中包含了很多实用的方法,比如绘制一条路径、区域、贴图、画点、画线、渲染文本,下面是Canvas类常用的方法,当然Android开发网提示大家很多方法有不同的重载版本,参数更灵活。voiddrawRect(RectFrect,Paintpaint)/绘制区域,参数一为
19、RectF一个区域voiddrawPath(Pathpath,Paintpaint)/绘制一个路径,参数一为Path路径对象voiddrawBitmap(Bitmapbitmap,Rectsrc,Rectdst,Paintpaint)/贴图,参数一就是我们常规的Bitmap对象,参数二是源区域(Android123提示这里是bitmap),参数三是目标区域(应该在canvas的位置和大小),参数四是Paint画刷对象,因为用到了缩放和拉伸的可能,当原始Rect不等于目标Rect时性能将会有大幅损失。voiddrawLine(floatstartX,floatstartY,floatstopX,
20、floatstopY,Paintpaint)/画线,参数一起始点的x轴位置,参数二起始点的y轴位置,参数三终点的x轴水平位置,参数四y轴垂直位置,最后一个参数为Paint画刷对象。voiddrawPoint(floatx,floaty,Paintpaint)/画点,参数一水平x轴,参数二垂直y轴,第三个参数为Paint对象。voiddrawText(Stringtext,floatx,floaty,Paintpaint)渲染文本,Canvas类除了上面的还可以描绘文字,参数一是String类型的文本,参数二x轴,参数三y轴,参数四是Paint对象。voiddrawTextOnPath(Stri
21、ngtext,Pathpath,floathOffset,floatvOffset,Paintpaint)/在路径上绘制文本,相对于上面第二个参数是Path路径对象从上面来看我们可以看出Canvas绘制类比较简单同时很灵活,实现一般的方法通常没有问题,同时可以叠加的处理设计出一些效果,不过细心的网友可能发现最后一个参数均为Paint对象如果我们把Canvas当做绘画师来看,那么Paint就是我们绘画的工具,比如画笔、画刷、颜料等等。Paint类常用方法:voidsetARGB(inta,intr,intg,intb)设置Paint对象颜色,参数一为alpha透明通道voidsetAlpha(i
22、nta)设置alpha不透明度,范围为0255voidsetAntiAlias(booleanaa)/是否抗锯齿voidsetColor(intcolor)/设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义voidsetFakeBoldText(booleanfakeBoldText)设置伪粗体文本voidsetLinearText(booleanlinearText)/设置线性文本PathEffectsetPathEffect(PathEffecteffect)/设置路径效果RasterizersetRasterizer(Rasterizerrasterizer)/
23、设置光栅化ShadersetShader(Shadershader)voidsetTextAlign(Paint.Alignalign)voidsetTextScaleX(floatscaleX)voidsetTextSize(floattextSize)设置阴影/设置文本对齐/设置文本缩放倍数,1.0f为原始/设置字体大小TypefacesetTypeface(Typefacetypeface)/设置字体,Typeface包含了字体的类型,粗细,还有倾斜、颜色等。voidsetUnderlineText(booleanunderlineText)设置下戈U线最终Canvas和Paint在on
24、Draw中直接使用OverrideprotectedvoidonDraw(Canvascanvas)PaintpaintRed=newPaint();paintRed.setColor(Color.Red);canvas.drawPoint(11,3,paintRed);/在坐标11,3上画一个红点)下一次Android123将会具体讲到强大的Path路径,和字体Typeface相关的使用。Android游戏开发之旅(五)Path和Typeface今天我们继续处理上次Android游戏开发之旅(四)Canvas和Paint实例中提到的Path路径和Typeface字体两个类。对于Android
25、游戏开发或者说2D绘图中来讲Path路径可以用强大这个词来形容。在Photoshop中我们可能还记得使用钢笔工具绘制路径的方法。Path路径类在位于android.graphics.Path中,Path的构造方法比较简单,如下Pathcwj=newPath();/构造方法复制代码下面我们画一个封闭的原型路径,我们使用Path类的addCircle方法cwj.addCircle(10,10,50,Direction.CW);/参数一为x轴水平位置,参数二为y轴垂直位置,第三个参数为圆形的半径,最后是绘制的方向,CW为顺时针方向,而CCW是逆时针方向复制代码结合Android上次提到的Canvas
26、类中的绘制方法drawPath和drawTextOnPath,我们继续可以在onDraw中加入。canvas.drawPath(cwj,paintPath);/Android123提示大家这里paintPath为路径的画刷颜色,可以见下文完整的源代码。canvas.drawTextOnPath(Android123-CWJ,cwj,0,15,paintText);/将文字绘制到路径中去,复制代码有关drawTextOnPath的参数如下:方法原型publicvoiddrawTextOnPath(Stringtext,Pathpath,floathOffset,floatvOffset,Pain
27、tpaint)复制代码参数列表text为需要在路径上绘制的文字内容。path将文字绘制到哪个路径。hOffset距离路径开始的距离vOffset离路径的上下高度,这里Android开发网提示大家,该参数类型为float浮点型,除了精度为8位小数外,可以为正或负,当为正时文字在路径的圈里面,为负时在路径的圈外面。paint最后仍然是一个Paint对象用于制定Text本文的颜色、字体、大小等属性。下面是我们的onDraw方法中如何绘制路径的演示代码为:OverrideprotectedvoidonDraw(Canvascanvas)PaintpaintPath=newPaint();Paintpa
28、intText=newPaint();paintPath.setColor(Color.Red);/路径的画刷为红色paintText.setColor(Color.Blue);/路径上的文字为蓝色PathpathCWJ=newPath();pathCWJ.addCircle(10,10,50,Direction.CW);/半径为50px,绘制的方向CW为顺时针canvas.drawPath(pathCWJ,paintPath);canvas.drawTextOnPath(Android123-CWJ,pathCWJ,0,15,paintText);/在路径上绘制文字复制代码有关路径类常用的方
29、法如下voidaddArc(RectFoval,floatstartAngle,floatsweepAngle)/为路径添加一个多边形给path添加圆圈添加一个圆角区域voidaddCircle(floatx,floaty,floatradius,Path.Directiondir)/voidaddOval(RectFoval,Path.Directiondir)/添加椭圆形voidaddRect(RectFrect,Path.Directiondir)/添加一个区域voidaddRoundRect(RectFrect,floatradii,Path.Directiondir)/boolean
30、isEmpty()/判断路径是否为空voidtransform(Matrixmatrix)/应用矩阵变换voidtransform(Matrixmatrix,Pathdst)/应用矩阵变换并将结果放到新的路径中,即第二个参数。复制代码有关路径的高级效果大家可以使用PathEffect类,有关路径的更多实例Android123将在今后的游戏开发实战中讲解道。Typeface字体类平时我们在TextView中需要设置显示的字体可以通过TextView中的setTypeface方法来指定一个Typeface对象,因为Android的字体类比较简单,我们列出所有成员方法staticTypefacecr
31、eate(Typefacefamily,intstyle)/静态方法,参数一为字体类型这里是Typeface的静态定义,如宋体,参数二风格,如粗体,斜体staticTypefacecreate(StringfamilyName,intstyle)/静态方法,参数一为字体名的字符串,参数二为风格同上,这里我们推荐使用上面的方法。staticTypefacecreateFromAsset(AssetManagermgr,Stringpath)/静态方法,参数一为AssetManager对象,主要用于从APK的assets文件夹中取出字体,参数二为相对于Android工程下的assets文件夹中的外
32、挂字体文件的路径。staticTypefacecreateFromFile(Filepath)/以是sdcard中的某个字体文件staticTypefacecreateFromFile(Stringpath)/staticTypefacedefaultFromStyle(intstyle)/静态方法,从文件系统构造一个字体,这里参数可静态方法,从指定路径中构造字体静态方法,返回默认的字体风格intgetStyle()/获取当前字体风格finalbooleanisBold()/判断当前是否为粗体finalbooleanisItalic()/判断当前风格是否为斜体复制代码本类的常量静态定义,首先为
33、字体类型名称TypefaceDEFAULTTypefaceDEFAULT_BOLDTypefaceMONOSPACETypefaceSANS_SERIFTypefaceSERIF字体风格名称intBOLDintBOLD_ITALICintITALICintNORMAL明天我们将在Android游戏开发之旅六自定义View一文中具体讲解onDraw以及什么时候会触发绘制方法,来实现我们自定义或子类化控件。Android游戏开发之旅六自定义View有关Android的自定义View的框架今天我们一起讨论下,对于常规的游戏,我们在View中需要处理以下几种问题:1.控制事件2.刷新View3.绘制V
34、iew1 .对于控制事件今天我们只处理按键事件onKeyDown,以后的文章中将会讲到屏幕触控的具体处理onTouchEvent以及Sensor重力感应等方法。2 .刷新view的方法这里主要有invalidate(intl,intt,intr,intb)刷新局部,四个参数分别为左、上、右、下。整个view刷新invalidate。,刷新一个矩形区域invalidate(Rectdirty),刷新一个特性Drawable,invalidateDrawable(Drawabledrawable),执行invalidate类的方法将会设置view为无效,最终导致onDraw方法被重新调用。由于今天
35、的view比较简单,Android123提示大家如果在线程中刷新,除了使用handler方式外,可以在Thread中直接使用postInvalidate方法来实现。3 .绘制View主要是onDraw()中通过形参canvas来处理,相关的绘制主要有drawRect、drawLine、drawPath等等。view方法内部还重写了很多接口,其回调方法可以帮助我们判断出view的位置和大小,比如onMeasure(int,int)Calledtodeterminethesizerequirementsforthisviewandallofitschildren.、onLayout(boolean
36、,int,int,int,int)Calledwhenthisviewshouldassignasizeandpositiontoallofitschildren和onSizeChanged(int,int,int,int)Calledwhenthesizeofthisviewhaschanged.具体的作用,大家可以用Logcat获取当view变化时每个形参的变动。下面cwjView是我们为今后游戏设计的一个简单自定义View框架,我们可以看到在Android平台自定义view还是很简单的,同时Java支持多继承可以帮助我们不断的完善复杂的问题。publicclasscwjViewexten
37、dsViewpubliccwjView(Contextcontext)super(context);setFocusable(true);/允许获得焦点setFocusableInTouchMode(true);/获取焦点时允许触控OverrideprotectedParcelableonSaveInstanceState()/处理窗口保存事件ParcelablepSaved=super.onSaveInstanceState();Bundlebundle=newBundle();/dosomethingreturnbundle;)OverrideprotectedvoidonRestoreI
38、nstanceState(Parcelablestate)/处理窗口还原事件Bundlebundle=(Bundle)state;/dosomethingsuper.onRestoreInstanceState(bundle.getParcelable(cwj);return;)OverrideprotectedvoidonSizeChanged(intw,inth,intoldw,intoldh)/处理窗口大小变化事件super.onSizeChanged(w,h,oldw,oldh);)OverrideprotectedvoidonMeasure(intwidthMeasureSpec,i
39、ntheightMeasureSpec)super.onMeasure(widthMeasureSpec,heightMeasureSpec);/如果不让父类处理记住调用setMeasuredDimension)OverrideprotectedvoidonLayout(booleanchanged,intleft,inttop,intright,intbottom)super.onLayout(changed,left,top,ight,bottom);)OverrideprotectedvoidonDraw(Canvascanvas)Paintbg=newPaint();bg.setCol
40、or(Color.Red);canvas.drawRect(0,0,getWidth()/2,getHeight()/2,bg);/将view的左上角四分之一填充为红色)OverridepublicbooleanonTouchEvent(MotionEventevent)returnsuper.onTouchEvent(event);/让父类处理屏幕触控事件)Override处理按键事件,响应的轨迹球publicbooleanonKeyDown(intkeyCode,KeyEventevent)/事件为publicbooleanonTrackballEvent(MotionEventevent
41、)switch(keyCode)caseKeyEvent.KEYCODE_DPAD_UP:break;caseKeyEvent.KEYCODE_DPAD_DOWN:break;caseKeyEvent.KEYCODE_DPAD_LEFT:break;caseKeyEvent.KEYCODE_DPAD_RIGHT:break;caseKeyEvent.KEYCODE_DPAD_CENTER:/处理中键按下break;default:returnsuper.onKeyDown(keyCode,event);returntrue;上面我们可以看到onMeasure使用的是父类的处理方法,如果我们需要
42、解决自定义View的大小,可以尝试下面的方法OverrideprotectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec)height=View.MeasureSpec.getSize(heightMeasureSpec);width=View.MeasureSpec.getSize(widthMeasureSpec);setMeasuredDimension(width,height);这里面是原始的大小,需要重新计算可以修改本/dosomethingAndroid游戏开发之旅七自定义SurfaceView今天我们说下未来的A
43、ndroid游戏引擎模板架构问题,对于游戏我们还是选择SurfaceView,相关的原因Android123已经在Android游戏开发之旅二View和SurfaceView中说的很清楚了,这里我们直接继承SurfaceView,实现SurfaceHolder.Callback接口,处理surfaceCreated、surfaceChanged以及surfaceDestroyed方法,这里我们并没有把按键控制传入,最终游戏的控制方面仍然由View内部类处理比较好,有关SurfaceView的具体我们可以参见Android开源项目的Camera中有关画面捕捉以及VideoView的控件实现大家可
44、以清晰了解最终的用意。publicclasscwjViewextendsSurfaceViewimplementsSurfaceHolder.CallbackpubliccwjView(Contextcontext,AttributeSetattrs)super(context,attrs);SurfaceHolderholder=getHolder();holder.addCallback(this);setFocusable(true);publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight)pub
45、licvoidsurfaceCreated(SurfaceHolderholder)publicvoidsurfaceDestroyed(SurfaceHolderholder)OverridepublicvoidonWindowFocusChanged(booleanhasWindowFocus)Android游戏开发之旅八SurfaceView类实例有关SurfaceView我们将通过三个系统自带的例子来深入掌握Android绘图必会的SurfaceView,今天我们以SDK中的Sample游戏lunarlander中的LunarView具体实现,Android123建议大家导入该游又工程
46、到你的Eclipse然后自己编译先玩一下这个游戏,然后再看代码比较好理解。classLunarViewextendsSurfaceViewimplementsSurfaceHolder.CallbackclassLunarThreadextendsThread/* Difficultysettingconstants*/publicstaticfinalintDIFFICULTY_EASY=0;publicstaticfinalintDIFFICULTY_HARD=1;publicstaticfinalintDIFFICULTY_MEDIUM=2;/* Physicsconstants*/pu
47、blicstaticfinalintPHYS_DOWN_ACCEL_SEC=35;publicstaticfinalintPHYS_FIRE_ACCEL_SEC=80;publicstaticfinalintPHYS_FUEL_INIT=60;publicstaticfinalintPHYS_FUEL_MAX=100;publicstaticfinalintPHYS_FUEL_SEC=10;publicstaticfinalintPHYS_SLEW_SEC=120;/degrees/secondrotatepublicstaticfinalintPHYS_SPEED_HYPERSPACE=18
48、0;publicstaticfinalintPHYS_SPEED_INIT=30;publicstaticfinalintPHYS_SPEED_MAX=120;/* State-trackingconstants*/publicstaticfinalintSTATE_LOSE=1;publicstaticfinalintSTATE_PAUSE=2;publicstaticfinalintSTATE_READY=3;publicstaticfinalintSTATE_RUNNING=4;publicstaticfinalintSTATE_WIN=5;/* Goalconditionconstan
49、ts*/publicstaticfinalintTARGET_ANGLE=18;/thisanglemeanscrashpublicstaticfinalintTARGET_BOTTOM_PADDING=17;/pxbelowgearpublicstaticfinalintTARGET_PAD_HEIGHT=8;/howhighabovegroundpublicstaticfinalintTARGET_SPEED=28;/thisspeedmeanscrashpublicstaticfinaldoubleTARGET_WIDTH=1.6;/widthoftarget/* UIconstants
50、(i.e.thespeed&fuelbars)* /publicstaticfinalintUI_BAR=100;/widthofthebar(s)publicstaticfinalintUI_BAR_HEIGHT=10;/heightofthebar(s)privatestaticfinalStringKEY_DIFFICULTY=mDifficulty;privatestaticfinalStringKEY_DX=mDX;privatestaticfinalStringKEY_DY=mDY;privatestaticfinalStringKEY_FUEL=mFuel;privatestat
51、icfinalStringKEY_GOAL_ANGLE=mGoalAngle;privatestaticfinalStringKEY_GOAL_SPEED=mGoalSpeed;privatestaticfinalStringKEY_GOAL_WIDTH=mGoalWidth;privatestaticfinalStringKEY_GOAL_X=mGoalX;privatestaticfinalStringKEY_HEADING=mHeading;privatestaticfinalStringKEY_LANDER_HEIGHT=mLanderHeight;privatestaticfinal
52、StringKEY_LANDER_WIDTH=mLanderWidth;privatestaticfinalStringKEY_WINS=mWinsInARow;privatestaticfinalStringKEY_X=mX;privatestaticfinalStringKEY_Y=mY;/* Member(state)fields* /*Thedrawabletouseasthebackgroundoftheanimationcanvas*/privateBitmapmBackgroundImage;/* Currentheightofthesurface/canvas.* see#se
53、tSurfaceSize* /privateintmCanvasHeight=1;/* Currentwidthofthesurface/canvas.*see#setSurfaceSize*/privateintmCanvasWidth=1;/*WhattodrawfortheLanderwhenithascrashed*/privateDrawablemCrashedImage;/*Currentdifficulty-amountoffuel,allowedangle,etc.DefaultisMEDIUM.*/privateintmDifficulty;/*Velocitydx.*/pr
54、ivatedoublemDX;/*Velocitydy.*/privatedoublemDY;/*Istheengineburning?*/privatebooleanmEngineFiring;/*WhattodrawfortheLanderwhentheengineisfiring*/privateDrawablemFiringImage;/*Fuelremaining*/privatedoublemFuel;/*Allowedangle.*/privateintmGoalAngle;/*Allowedspeed.*/privateintmGoalSpeed;/*Widthofthelan
55、dingpad.*/privateintmGoalWidth;/*Xofthelandingpad.*/privateintmGoalX;/*MessagehandlerusedbythreadtointeractwithTextView*/privateHandlermHandler;/*Landerheadingindegrees,with0up,90right.Keptintherange*0.360.*/privatedoublemHeading;/*Pixelheightoflanderimage.*/privateintmLanderHeight;/*WhattodrawfortheLanderinitsnormalstate*/privateDrawablemLanderlmage;/*Pixelwidthoflanderimage.*/pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年人力资源管理师《职业素养与职业道德》备考题库及答案解析
- 2025年神经内科常见神经系统疾病诊疗模拟考试试题及答案解析
- 2025年城市规划师《城市设计与规划原理》备考试题及答案解析
- 从业资格证的试题及答案
- 2023年中级经济师《经济基础知识》考试真题及答案(4月8日上午)
- 油母页岩干馏工安全操作水平考核试卷含答案
- 供热生产调度工持续改进评优考核试卷含答案
- 安全生产考试题库有必要及答案解析
- 调饮师岗前技术实操考核试卷含答案
- 一次雷达机务员岗前安全生产知识考核试卷含答案
- 2024-2025学年广东省广州六中八年级上学期期中语文试卷(含答案)
- 2025至2030全球及中国基于智能手机的汽车信息娱乐系统行业市场深度研究与战略咨询分析报告
- 法院网络安全责任制
- 九九重阳+爱老敬老+课件-2025-2026学年上学期主题班会
- 酒店房间装修成本概算和评估表格
- 2025年政府驻外招商笔试答题技巧
- 生涯发展报告
- 交管12123学法减分考试试题及答案
- “农药水悬浮剂加工及贮藏中的常见问题及其对策”课件
- 农民工工资舆情应对培训交底资料
- 人教部编版八级历史上册八国联军侵华与《辛丑条约》签订优秀课件ppt
 
            
评论
0/150
提交评论