




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 春季高考培訓總結
- 社會聽話測試題及答案
- 港務集團面試題及答案
- 公平主義面試題及答案
- 導購服務意識培訓
- 中國系統java面試題及答案
- 船舶技工面試題及答案
- 腫瘤康復后的心理護理
- 2025年高效蒸汽管網設備項目申請報告模范
- 腫瘤科護理基本流程
- 兒童用藥合理使用課件
- 2025-2030年中國發泡包裝行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025至2030中國材料疲勞試驗機行業項目調研及市場前景預測評估報告
- 2025年陜西、山西、寧夏、青海四省(陜晉寧青)高考 生物真題試卷 附答案
- 2025春季學期國開電大本科《人文英語4》一平臺機考真題及答案(第五套)
- 2024年西昌市教育和體育局考核聘用公立幼兒園教師真題
- 2025年全國高考數學真題全國2卷
- 2025年高考數學全國二卷試題真題及答案詳解(精校打印)
- 山東省2024年藝術類本科批美術與設計類第1次志愿投檔情況表(公布)
- 土地利用變更調查課件
- DB13T 5181-2020 尾礦庫潰壩泥石流數值模擬技術規程
評論
0/150
提交評論