




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Android游戲開發(fā)之旅一長按Button原理今天Android123開始新的Android游戲開發(fā)之旅系列,主要從控制方法(按鍵、軌跡球、觸屏、重力感應(yīng)、攝像頭、話筒氣流、光線亮度卜圖形View(高效繪圖技術(shù)如雙緩沖卜音效(游戲音樂)以及最后的OpenGLES(Java層)和NDK的OpenGL和J2ME游戲移植到Android方法,當(dāng)然還有一些游戲?qū)崿F(xiàn)慣用方法,比如地圖編輯器,在AndroidOpenGL如何使用MD2文件,個(gè)部分講述下Android游戲開發(fā)的過程最終實(shí)現(xiàn)一個(gè)比較完整的游戲引擎。相信大家都清楚AndroidMarket下載量比較好的都是游戲,未來手機(jī)網(wǎng)游的發(fā)展相信Andr
2、oid使用的Java在這方面有比iPhone有更低的入門門檻。對于很多游戲使用屏幕控制一般需要考慮長按事件,比如在動(dòng)作類的游戲中需要長按發(fā)射武器,結(jié)合AndroidButton模型,我們實(shí)現(xiàn)一個(gè)帶圖片的Button的長按,為了更清晰的顯示原理,Android開發(fā)網(wǎng)這里使用ImageButton作為基類publicclassRepeatingImageButtonextendsImageButtonprivatelongmStartTime;/記錄長按開始privateintmRepeatCount;/重復(fù)次數(shù)計(jì)數(shù)privateRepeatListenermListener;privatelon
3、gmInterval=500;/Timer觸發(fā)間隔,即每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);/允許獲得焦點(diǎn)setLongClickable(true);/啟用長按事件publicvoidsetRepeatListener(RepeatListenerl,longinterval)/實(shí)現(xiàn)重復(fù)按下事件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手機(jī)上的物理按鍵事件removeCallbacks(mRepeater);if(mStartTime!=0)doRepeat(true);mStartTime=0;)returnsuper.onTouchEvent(event);)/處理導(dǎo)航鍵事件的中鍵或軌跡球按下事件OverridepublicbooleanonKeyDown
6、(intkeyCode,KeyEventevent)switch(keyCode)caseKeyEvent.KEYCODE_DPAD_CENTER:caseKeyEvent.KEYCODE_ENTER:super.onKeyDown(keyCode,event);returntrue;)returnsuper.onKeyDown(keyCode,event);)/當(dāng)按鍵彈起通知長按結(jié)束OverridepublicbooleanonKeyUp(intkeyCode,KeyEventevent)switch(keyCode)caseKeyEvent.KEYCODE_DPAD_CENTER:case
7、KeyEvent.KEYCODE_ENTER:removeCallbacks(mRepeater);/取消重復(fù)listener捕獲if(mStartTime!=0)doRepeat(true);/如果長按事件累計(jì)時(shí)間不為0則說明長按了mStartTime=0;/重置長按計(jì)時(shí)器)returnsuper.onKeyUp(keyCode,event);)privateRunnablemRepeater=newRunnable()/在線程中判斷重復(fù)publicvoidrun()doRepeat(false);if(isPressed()postDelayed(this,mInterval);/計(jì)算長按
8、后延遲下一次累加);privatevoiddoRepeat(booleanlast)longnow=SystemClock.elapsedRealtime();if(mListener!=null)mListener.onRepeat(this,now-mStartTime,last?-1:mRepeatCount+);)下面是重復(fù)ButtonListener接口的定義,調(diào)用時(shí)在Button中先使用setRepeatListener()方法實(shí)現(xiàn)RepeatListener接口publicinterfaceRepeatListenervoidonRepeat(Viewv,longduration
9、,intrepeatcount);/參數(shù)為用戶傳入的Button對象,參數(shù)二為延遲的毫秒數(shù),第三位重復(fù)次數(shù)回調(diào)。)Android游戲開發(fā)之旅二View和SurfaceView在Android游戲當(dāng)中充當(dāng)主要的除了控制類外就是顯示類,在J2ME中我們用Display和Canvas來實(shí)現(xiàn)這些,而GoogleAndroid中涉及到顯示的為view類,Android游戲開發(fā)中比較重要和復(fù)雜的就是顯示和游戲邏輯的處理。這里我們說下android.view.View和android.view.SurfaceView。SurfaceView是從View基類中派生出來的顯示類,直接子類有GLSurfaceVi
10、ew和VideoView,可以看出GL和視頻播放以及Camera攝像頭一般均使用SurfaceView,到底有哪些優(yōu)勢呢?SurfaceView可以控制表面的格式,比如大小,顯示在屏幕中的位置,最關(guān)鍵是的提供了SurfaceHolder類,使用getHolder方法獲取,相關(guān)的有CanvaslockCanvas()CanvaslockCanvas(Rectdirty)、voidremoveCallback(SurfaceHolder.Callbackcallback)、voidunlockCanvasAndPost(Canvascanvas)控制圖形以及繪制,而在SurfaceHolder.C
11、allback接口回調(diào)中可以通過下面三個(gè)抽象類可以自己定義具體的實(shí)現(xiàn),比如第一個(gè)更改格式和顯示畫面。abstractvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight)abstractvoidsurfaceCreated(SurfaceHolderholder)abstractvoidsurfaceDestroyed(SurfaceHolderholder)對于Surface相關(guān)的,Android底層還提供了GPU加速功能,所以一般實(shí)時(shí)性很強(qiáng)的應(yīng)用中主要使用SurfaceView而不是直接從View構(gòu)建,同時(shí)A
12、ndroid123未來后面說到的OpenGL中的GLSurfaceView也是從該類實(shí)現(xiàn)。Android游戲開發(fā)之旅三View類詳解在Android游戲開發(fā)之旅二中我們講到了View和SurfaceView的區(qū)別,今天Android123從View類開始著重的介紹Android圖形顯示基類的相關(guān)方法和注意點(diǎn)。自定義View的常用方法:onFinishInflate()當(dāng)View中所有的子控件均被映射成xml后觸發(fā)onMeasure(int,int)確定所有子元素的大小onLayout(boolean,int,int,int,int)當(dāng)View分配所有的子元素的大小和位置時(shí)觸發(fā)onSizeCha
13、nged(int,int,int,int)當(dāng)view的大小發(fā)生變化時(shí)觸發(fā)onDraw(Canvas)view渲染內(nèi)容的細(xì)節(jié)onKeyDown(int,KeyEvent)有按鍵按下后觸發(fā)onKeyUp(int,KeyEvent)有按鍵按下后彈起時(shí)觸發(fā)onTrackballEvent(MotionEvent)軌跡球事件onTouchEvent(MotionEvent)觸屏事件onFocusChanged(boolean,int,Rect)當(dāng)View獲取或失去焦點(diǎn)時(shí)觸發(fā)onWindowFocusChanged(boolean)當(dāng)窗口包含的view獲取或失去焦點(diǎn)時(shí)觸發(fā)onAttachedToWindo
14、w()當(dāng)view被附著到一個(gè)窗口時(shí)觸發(fā)onDetachedFromWindow()當(dāng)view離開附著的窗口時(shí)觸發(fā),Android123提示該方法和onAttachedToWindow()是相反的。onWindowVisibilityChanged(int)當(dāng)窗口中包含的可見的view發(fā)生變化時(shí)觸發(fā)以上是View實(shí)現(xiàn)的一些基本接口的回調(diào)方法,一般我們需要處理畫布的顯示時(shí),重寫onDraw(Canvas)用的的是最多的:OverrideprotectedvoidonDraw(Canvascanvas)Paint來選擇要填充的顏色/這里我們直接使用canvas對象處理當(dāng)前的畫布,比如說使用Paint
15、paintBackground=newPaint();paintBackground.setC010r(getResources().getC010r(R.color.xxx);從Res中找到名為xxx的color顏色定義canvas.drawRect(0,0,getWidth(),getHeight(),paintBackground);/設(shè)置當(dāng)前畫布的背景顏色為paintBackground中定義的顏色,以0,0作為為起點(diǎn),以當(dāng)前畫布的寬度和高度為重點(diǎn)即整塊畫布來填充。具體的請查看Android123未來講到的Canvas和Paint,在Canvas中我們可以實(shí)現(xiàn)畫路徑,圖形,區(qū)域,線。而
16、Paint作為繪畫方式的對象可以設(shè)置顏色,大小,甚至字體的類型等等。當(dāng)然還有就是處理窗口還原狀態(tài)問題(一般用于橫豎屏切換),除了在Activity中可以調(diào)用外,開發(fā)游戲時(shí)我們盡量在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中如果需要強(qiáng)制調(diào)用繪制方法onDraw,可以使用invalidate()方法,它有很多重載版本,同時(shí)在線程中的postInvailida
18、te()方法將在Android游戲開發(fā)之旅六中的自定義View完整篇講到。Android游戲開發(fā)之旅四Canvas和Paint實(shí)例昨天我們在Android游戲開發(fā)之旅三View詳解中提到了onDraw方法,有關(guān)詳細(xì)的實(shí)現(xiàn)我們今天主要說下Android的Canvas和Paint對象的使用實(shí)例。Canvas類主要實(shí)現(xiàn)了屏幕的繪制過程,其中包含了很多實(shí)用的方法,比如繪制一條路徑、區(qū)域、貼圖、畫點(diǎn)、畫線、渲染文本,下面是Canvas類常用的方法,當(dāng)然Android開發(fā)網(wǎng)提示大家很多方法有不同的重載版本,參數(shù)更靈活。voiddrawRect(RectFrect,Paintpaint)/繪制區(qū)域,參數(shù)一為
19、RectF一個(gè)區(qū)域voiddrawPath(Pathpath,Paintpaint)/繪制一個(gè)路徑,參數(shù)一為Path路徑對象voiddrawBitmap(Bitmapbitmap,Rectsrc,Rectdst,Paintpaint)/貼圖,參數(shù)一就是我們常規(guī)的Bitmap對象,參數(shù)二是源區(qū)域(Android123提示這里是bitmap),參數(shù)三是目標(biāo)區(qū)域(應(yīng)該在canvas的位置和大小),參數(shù)四是Paint畫刷對象,因?yàn)橛玫搅丝s放和拉伸的可能,當(dāng)原始Rect不等于目標(biāo)Rect時(shí)性能將會有大幅損失。voiddrawLine(floatstartX,floatstartY,floatstopX,
20、floatstopY,Paintpaint)/畫線,參數(shù)一起始點(diǎn)的x軸位置,參數(shù)二起始點(diǎn)的y軸位置,參數(shù)三終點(diǎn)的x軸水平位置,參數(shù)四y軸垂直位置,最后一個(gè)參數(shù)為Paint畫刷對象。voiddrawPoint(floatx,floaty,Paintpaint)/畫點(diǎn),參數(shù)一水平x軸,參數(shù)二垂直y軸,第三個(gè)參數(shù)為Paint對象。voiddrawText(Stringtext,floatx,floaty,Paintpaint)渲染文本,Canvas類除了上面的還可以描繪文字,參數(shù)一是String類型的文本,參數(shù)二x軸,參數(shù)三y軸,參數(shù)四是Paint對象。voiddrawTextOnPath(Stri
21、ngtext,Pathpath,floathOffset,floatvOffset,Paintpaint)/在路徑上繪制文本,相對于上面第二個(gè)參數(shù)是Path路徑對象從上面來看我們可以看出Canvas繪制類比較簡單同時(shí)很靈活,實(shí)現(xiàn)一般的方法通常沒有問題,同時(shí)可以疊加的處理設(shè)計(jì)出一些效果,不過細(xì)心的網(wǎng)友可能發(fā)現(xiàn)最后一個(gè)參數(shù)均為Paint對象如果我們把Canvas當(dāng)做繪畫師來看,那么Paint就是我們繪畫的工具,比如畫筆、畫刷、顏料等等。Paint類常用方法:voidsetARGB(inta,intr,intg,intb)設(shè)置Paint對象顏色,參數(shù)一為alpha透明通道voidsetAlpha(i
22、nta)設(shè)置alpha不透明度,范圍為0255voidsetAntiAlias(booleanaa)/是否抗鋸齒voidsetColor(intcolor)/設(shè)置顏色,這里Android內(nèi)部定義的有Color類包含了一些常見顏色定義voidsetFakeBoldText(booleanfakeBoldText)設(shè)置偽粗體文本voidsetLinearText(booleanlinearText)/設(shè)置線性文本PathEffectsetPathEffect(PathEffecteffect)/設(shè)置路徑效果RasterizersetRasterizer(Rasterizerrasterizer)/
23、設(shè)置光柵化ShadersetShader(Shadershader)voidsetTextAlign(Paint.Alignalign)voidsetTextScaleX(floatscaleX)voidsetTextSize(floattextSize)設(shè)置陰影/設(shè)置文本對齊/設(shè)置文本縮放倍數(shù),1.0f為原始/設(shè)置字體大小TypefacesetTypeface(Typefacetypeface)/設(shè)置字體,Typeface包含了字體的類型,粗細(xì),還有傾斜、顏色等。voidsetUnderlineText(booleanunderlineText)設(shè)置下戈U線最終Canvas和Paint在on
24、Draw中直接使用OverrideprotectedvoidonDraw(Canvascanvas)PaintpaintRed=newPaint();paintRed.setColor(Color.Red);canvas.drawPoint(11,3,paintRed);/在坐標(biāo)11,3上畫一個(gè)紅點(diǎn))下一次Android123將會具體講到強(qiáng)大的Path路徑,和字體Typeface相關(guān)的使用。Android游戲開發(fā)之旅(五)Path和Typeface今天我們繼續(xù)處理上次Android游戲開發(fā)之旅(四)Canvas和Paint實(shí)例中提到的Path路徑和Typeface字體兩個(gè)類。對于Android
25、游戲開發(fā)或者說2D繪圖中來講Path路徑可以用強(qiáng)大這個(gè)詞來形容。在Photoshop中我們可能還記得使用鋼筆工具繪制路徑的方法。Path路徑類在位于android.graphics.Path中,Path的構(gòu)造方法比較簡單,如下Pathcwj=newPath();/構(gòu)造方法復(fù)制代碼下面我們畫一個(gè)封閉的原型路徑,我們使用Path類的addCircle方法cwj.addCircle(10,10,50,Direction.CW);/參數(shù)一為x軸水平位置,參數(shù)二為y軸垂直位置,第三個(gè)參數(shù)為圓形的半徑,最后是繪制的方向,CW為順時(shí)針方向,而CCW是逆時(shí)針方向復(fù)制代碼結(jié)合Android上次提到的Canvas
26、類中的繪制方法drawPath和drawTextOnPath,我們繼續(xù)可以在onDraw中加入。canvas.drawPath(cwj,paintPath);/Android123提示大家這里paintPath為路徑的畫刷顏色,可以見下文完整的源代碼。canvas.drawTextOnPath(Android123-CWJ,cwj,0,15,paintText);/將文字繪制到路徑中去,復(fù)制代碼有關(guān)drawTextOnPath的參數(shù)如下:方法原型publicvoiddrawTextOnPath(Stringtext,Pathpath,floathOffset,floatvOffset,Pain
27、tpaint)復(fù)制代碼參數(shù)列表text為需要在路徑上繪制的文字內(nèi)容。path將文字繪制到哪個(gè)路徑。hOffset距離路徑開始的距離vOffset離路徑的上下高度,這里Android開發(fā)網(wǎng)提示大家,該參數(shù)類型為float浮點(diǎn)型,除了精度為8位小數(shù)外,可以為正或負(fù),當(dāng)為正時(shí)文字在路徑的圈里面,為負(fù)時(shí)在路徑的圈外面。paint最后仍然是一個(gè)Paint對象用于制定Text本文的顏色、字體、大小等屬性。下面是我們的onDraw方法中如何繪制路徑的演示代碼為:OverrideprotectedvoidonDraw(Canvascanvas)PaintpaintPath=newPaint();Paintpa
28、intText=newPaint();paintPath.setColor(Color.Red);/路徑的畫刷為紅色paintText.setColor(Color.Blue);/路徑上的文字為藍(lán)色PathpathCWJ=newPath();pathCWJ.addCircle(10,10,50,Direction.CW);/半徑為50px,繪制的方向CW為順時(shí)針canvas.drawPath(pathCWJ,paintPath);canvas.drawTextOnPath(Android123-CWJ,pathCWJ,0,15,paintText);/在路徑上繪制文字復(fù)制代碼有關(guān)路徑類常用的方
29、法如下voidaddArc(RectFoval,floatstartAngle,floatsweepAngle)/為路徑添加一個(gè)多邊形給path添加圓圈添加一個(gè)圓角區(qū)域voidaddCircle(floatx,floaty,floatradius,Path.Directiondir)/voidaddOval(RectFoval,Path.Directiondir)/添加橢圓形voidaddRect(RectFrect,Path.Directiondir)/添加一個(gè)區(qū)域voidaddRoundRect(RectFrect,floatradii,Path.Directiondir)/boolean
30、isEmpty()/判斷路徑是否為空voidtransform(Matrixmatrix)/應(yīng)用矩陣變換voidtransform(Matrixmatrix,Pathdst)/應(yīng)用矩陣變換并將結(jié)果放到新的路徑中,即第二個(gè)參數(shù)。復(fù)制代碼有關(guān)路徑的高級效果大家可以使用PathEffect類,有關(guān)路徑的更多實(shí)例Android123將在今后的游戲開發(fā)實(shí)戰(zhàn)中講解道。Typeface字體類平時(shí)我們在TextView中需要設(shè)置顯示的字體可以通過TextView中的setTypeface方法來指定一個(gè)Typeface對象,因?yàn)锳ndroid的字體類比較簡單,我們列出所有成員方法staticTypefacecr
31、eate(Typefacefamily,intstyle)/靜態(tài)方法,參數(shù)一為字體類型這里是Typeface的靜態(tài)定義,如宋體,參數(shù)二風(fēng)格,如粗體,斜體staticTypefacecreate(StringfamilyName,intstyle)/靜態(tài)方法,參數(shù)一為字體名的字符串,參數(shù)二為風(fēng)格同上,這里我們推薦使用上面的方法。staticTypefacecreateFromAsset(AssetManagermgr,Stringpath)/靜態(tài)方法,參數(shù)一為AssetManager對象,主要用于從APK的assets文件夾中取出字體,參數(shù)二為相對于Android工程下的assets文件夾中的外
32、掛字體文件的路徑。staticTypefacecreateFromFile(Filepath)/以是sdcard中的某個(gè)字體文件staticTypefacecreateFromFile(Stringpath)/staticTypefacedefaultFromStyle(intstyle)/靜態(tài)方法,從文件系統(tǒng)構(gòu)造一個(gè)字體,這里參數(shù)可靜態(tài)方法,從指定路徑中構(gòu)造字體靜態(tài)方法,返回默認(rèn)的字體風(fēng)格intgetStyle()/獲取當(dāng)前字體風(fēng)格finalbooleanisBold()/判斷當(dāng)前是否為粗體finalbooleanisItalic()/判斷當(dāng)前風(fēng)格是否為斜體復(fù)制代碼本類的常量靜態(tài)定義,首先為
33、字體類型名稱TypefaceDEFAULTTypefaceDEFAULT_BOLDTypefaceMONOSPACETypefaceSANS_SERIFTypefaceSERIF字體風(fēng)格名稱intBOLDintBOLD_ITALICintITALICintNORMAL明天我們將在Android游戲開發(fā)之旅六自定義View一文中具體講解onDraw以及什么時(shí)候會觸發(fā)繪制方法,來實(shí)現(xiàn)我們自定義或子類化控件。Android游戲開發(fā)之旅六自定義View有關(guān)Android的自定義View的框架今天我們一起討論下,對于常規(guī)的游戲,我們在View中需要處理以下幾種問題:1.控制事件2.刷新View3.繪制V
34、iew1 .對于控制事件今天我們只處理按鍵事件onKeyDown,以后的文章中將會講到屏幕觸控的具體處理onTouchEvent以及Sensor重力感應(yīng)等方法。2 .刷新view的方法這里主要有invalidate(intl,intt,intr,intb)刷新局部,四個(gè)參數(shù)分別為左、上、右、下。整個(gè)view刷新invalidate。,刷新一個(gè)矩形區(qū)域invalidate(Rectdirty),刷新一個(gè)特性Drawable,invalidateDrawable(Drawabledrawable),執(zhí)行invalidate類的方法將會設(shè)置view為無效,最終導(dǎo)致onDraw方法被重新調(diào)用。由于今天
35、的view比較簡單,Android123提示大家如果在線程中刷新,除了使用handler方式外,可以在Thread中直接使用postInvalidate方法來實(shí)現(xiàn)。3 .繪制View主要是onDraw()中通過形參canvas來處理,相關(guān)的繪制主要有drawRect、drawLine、drawPath等等。view方法內(nèi)部還重寫了很多接口,其回調(diào)方法可以幫助我們判斷出view的位置和大小,比如onMeasure(int,int)Calledtodeterminethesizerequirementsforthisviewandallofitschildren.、onLayout(boolean
36、,int,int,int,int)Calledwhenthisviewshouldassignasizeandpositiontoallofitschildren和onSizeChanged(int,int,int,int)Calledwhenthesizeofthisviewhaschanged.具體的作用,大家可以用Logcat獲取當(dāng)view變化時(shí)每個(gè)形參的變動(dòng)。下面cwjView是我們?yōu)榻窈笥螒蛟O(shè)計(jì)的一個(gè)簡單自定義View框架,我們可以看到在Android平臺自定義view還是很簡單的,同時(shí)Java支持多繼承可以幫助我們不斷的完善復(fù)雜的問題。publicclasscwjViewexten
37、dsViewpubliccwjView(Contextcontext)super(context);setFocusable(true);/允許獲得焦點(diǎn)setFocusableInTouchMode(true);/獲取焦點(diǎn)時(shí)允許觸控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);/如果不讓父類處理記住調(diào)用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處理按鍵事件,響應(yīng)的軌跡球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);這里面是原始的大小,需要重新計(jì)算可以修改本/dosomethingAndroid游戲開發(fā)之旅七自定義SurfaceView今天我們說下未來的A
43、ndroid游戲引擎模板架構(gòu)問題,對于游戲我們還是選擇SurfaceView,相關(guān)的原因Android123已經(jīng)在Android游戲開發(fā)之旅二View和SurfaceView中說的很清楚了,這里我們直接繼承SurfaceView,實(shí)現(xiàn)SurfaceHolder.Callback接口,處理surfaceCreated、surfaceChanged以及surfaceDestroyed方法,這里我們并沒有把按鍵控制傳入,最終游戲的控制方面仍然由View內(nèi)部類處理比較好,有關(guān)SurfaceView的具體我們可以參見Android開源項(xiàng)目的Camera中有關(guān)畫面捕捉以及VideoView的控件實(shí)現(xiàn)大家可
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游戲開發(fā)之旅八SurfaceView類實(shí)例有關(guān)SurfaceView我們將通過三個(gè)系統(tǒng)自帶的例子來深入掌握Android繪圖必會的SurfaceView,今天我們以SDK中的Sample游戲lunarlander中的LunarView具體實(shí)現(xiàn),Android123建議大家導(dǎo)入該游又工程
46、到你的Eclipse然后自己編譯先玩一下這個(gè)游戲,然后再看代碼比較好理解。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 代理報(bào)關(guān)合同
- 骶髂關(guān)節(jié)改變個(gè)案護(hù)理
- 前臂創(chuàng)傷性切斷的護(hù)理
- 心包惡性腫瘤護(hù)理措施
- 咨詢效率量化評估-洞察及研究
- 兒童科學(xué)探究能力培養(yǎng)的量化評價(jià)體系
- 變電所操作與工作票填寫規(guī)范及模板
- 髂窩結(jié)核的治療及護(hù)理
- 宮頸息肉的護(hù)理課件
- 肺動(dòng)脈炎的護(hù)理查房
- 【南通】2025年江蘇省通州區(qū)西亭鎮(zhèn)招聘民政協(xié)理員1人筆試歷年典型考題
- 2025年七一黨課-作風(fēng)建設(shè)永遠(yuǎn)在路上學(xué)習(xí)教育黨課
- 遼寧省文體旅集團(tuán)所屬兩家企業(yè)招聘筆試題庫2025
- 2025年江蘇省惠隆資產(chǎn)管理有限公司招聘筆試參考題庫含答案解析
- 消除“艾梅乙”醫(yī)療歧視-從我做起
- 湖南省長沙市2022-2023學(xué)年新高一英語入學(xué)分班考試試卷【含答案】
- k-bus產(chǎn)品手冊中文版ip interface使用手冊
- 第九講有機(jī)化學(xué)結(jié)構(gòu)理論
- 工程化學(xué)復(fù)習(xí)要點(diǎn)及習(xí)題解答童志平版本PPT課件
- 論中心蝶閥、單、雙、三、四偏心蝶閥
評論
0/150
提交評論