生活随笔
收集整理的這篇文章主要介紹了
Android游戏开发中绘制游戏触摸轨迹的曲线图
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?? 本篇文章主要來(lái)講解怎樣繪制游戲觸摸軌跡的曲線(xiàn)圖。
?????? 我們?cè)趏nTouchEvent方法中,可以獲取到觸摸屏幕時(shí)手指觸摸點(diǎn)的x、y坐標(biāo),如何用這些點(diǎn)形成一條無(wú)規(guī)則軌跡并把這條無(wú)規(guī)則軌跡曲線(xiàn)顯示在屏幕上就是本篇文章的主旨內(nèi)容。
???????Android Path類(lèi)
???????Android提供了一個(gè)Path類(lèi) , 顧名思義這個(gè)類(lèi)可以設(shè)置曲線(xiàn)路徑軌跡。任何無(wú)規(guī)則的曲線(xiàn)實(shí)際上都是由若干條線(xiàn)段組成,而線(xiàn)段的定義為兩點(diǎn)之間最短的一條線(xiàn)。path類(lèi)就 可以記錄這兩點(diǎn)之間的軌跡,那么若干個(gè)Path 就是我們須要繪制的無(wú)規(guī)則曲線(xiàn)。
?????? 下面介紹一下API 中path類(lèi)設(shè)置軌跡路徑的方法。
?????? public class
?????? Path ?????? extends Object ?????? java.lang.Object ?????? android.graphics.Path
?????? quadTo(float x1, float y1, float x2, float y2) ?????? Add a quadratic bezier from the last point, approaching control point (x1,y1), and ending at (x2,y2).
?????? 解釋:
?????? 參數(shù)1 軌跡起始點(diǎn)X坐標(biāo)
?????? 參數(shù)2 軌跡起始點(diǎn)Y坐標(biāo)
?????? 參數(shù)3 軌跡結(jié)束點(diǎn)X坐標(biāo)
?????? 參數(shù)4 軌跡結(jié)束點(diǎn)Y坐標(biāo)
?????? 所以根據(jù)這個(gè)參數(shù)就可以設(shè)置一條線(xiàn)段軌跡。
???????分步講解
?????? 為了設(shè)置一條比較圓滑好看的曲線(xiàn)我們需要對(duì)游戲畫(huà)筆進(jìn)行一些設(shè)置。注釋已經(jīng)在代碼中寫(xiě)的很清楚了,在這里我詳細(xì)說(shuō)一下 設(shè)置畫(huà)筆風(fēng)格? mPaint.setStyle(Paint.Style.STROKE); 意思是設(shè)置畫(huà)筆的風(fēng)格 android 畫(huà)筆一共提供了三種風(fēng)格Paint.Style.STROKE 、Paint.Style.FILL、Paint.Style.FILL_AND_STROKE 意思分別為 空心 、實(shí)心、實(shí)心與空心 。如果不設(shè)置的話(huà)默認(rèn)為 Paint.Style.FILL,在這里必須設(shè)置成空心。因?yàn)槿绻坏┰O(shè)置成實(shí)心或者實(shí)心與空心那么畫(huà)筆會(huì)把path路徑中間包住這樣就不是曲線(xiàn)線(xiàn)段了,所以大家注意一下這里。
Java代碼
/**?創(chuàng)建曲線(xiàn)畫(huà)筆?**/?? mPaint?=?new?Paint(); ?? mPaint.setColor(Color.BLACK); ?? /**設(shè)置畫(huà)筆抗鋸齒**/?? mPaint.setAntiAlias(true); ?? /**畫(huà)筆的類(lèi)型**/?? mPaint.setStyle(Paint.Style.STROKE); ?? /**設(shè)置畫(huà)筆變?yōu)閳A滑狀**/?? mPaint.setStrokeCap(Paint.Cap.ROUND); ?? /**設(shè)置線(xiàn)的寬度**/?? mPaint.setStrokeWidth(5);??
?????? 在觸摸按下事件中 通過(guò)moveTo() 方法設(shè)置觸摸屏幕點(diǎn)為軌跡的起始點(diǎn),這樣在觸摸移動(dòng)事件中設(shè)置曲線(xiàn)的軌跡 起始點(diǎn)為上次觸摸點(diǎn) 結(jié)束點(diǎn)為本次觸摸點(diǎn)。使用quadTo方法記錄每次移動(dòng)產(chǎn)生的一個(gè)曲線(xiàn)線(xiàn)段 然后將所有的曲線(xiàn)線(xiàn)段繪制在屏幕中,如果觸摸抬起將調(diào)用reset()方法重置曲線(xiàn)軌跡。
Java代碼
@Override?? public?boolean?onTouchEvent(MotionEvent?event)?{ ?? ????/**?拿到觸摸的狀態(tài)?**/?? ????int?action?=?event.getAction(); ?? ????float?x?=?event.getX(); ?? ????float?y?=?event.getY(); ?? ????switch?(action)?{ ?? ????//?觸摸按下的事件??? ????case?MotionEvent.ACTION_DOWN: ?? ????/**設(shè)置曲線(xiàn)軌跡起點(diǎn)?X?Y坐標(biāo)**/?? ????mPath.moveTo(x,?y); ?? ????break; ?? ????//?觸摸移動(dòng)的事件??? ????case?MotionEvent.ACTION_MOVE: ?? ????/**設(shè)置曲線(xiàn)軌跡**/?? ????//參數(shù)1?起始點(diǎn)X坐標(biāo)??? ????//參數(shù)2?起始點(diǎn)Y坐標(biāo)??? ????//參數(shù)3?結(jié)束點(diǎn)X坐標(biāo)??? ????//參數(shù)4?結(jié)束點(diǎn)Y坐標(biāo)??? ????mPath.quadTo(mposX,?mposY,?x,?y); ?? ????break; ?? ????//?觸摸抬起的事件??? ????case?MotionEvent.ACTION_UP: ?? ????/**按鍵抬起后清空路徑軌跡**/?? ????mPath.reset(); ?? ????break; ?? ????} ?? ???//記錄當(dāng)前觸摸X?Y坐標(biāo)??? ????mposX?=?x; ?? ????mposY?=?y; ?? ????return?true; ?? } ??
????? 游戲繪制中調(diào)用drawPath方法將onTouchEvent中記錄的路徑曲線(xiàn)繪制在屏幕當(dāng)中。
Java代碼
private?void?Draw()?{ ?? ????/**清空畫(huà)布**/?? ????mCanvas.drawColor(Color.WHITE); ?? ????/**繪制曲線(xiàn)**/?? ????mCanvas.drawPath(mPath,?mPaint); ?? ????/**記錄當(dāng)前觸點(diǎn)位置**/?? ????mCanvas.drawText("當(dāng)前觸筆?X:"?+?mposX,?0,?20,mTextPaint); ?? ????mCanvas.drawText("當(dāng)前觸筆?Y:"?+?mposY,?0,?40,mTextPaint); ?? }??
???????代碼的整體實(shí)現(xiàn)
?????? 詳細(xì)的論壇 注釋已經(jīng)在代碼中寫(xiě)出 歡迎大家閱讀喔 哇咔咔~~~~
Java代碼
import?android.app.Activity; ?? import?android.content.Context; ?? import?android.graphics.Canvas; ?? import?android.graphics.Color; ?? import?android.graphics.Paint; ?? import?android.graphics.Path; ?? import?android.os.Bundle; ?? import?android.view.MotionEvent; ?? import?android.view.SurfaceHolder; ?? import?android.view.SurfaceView; ?? import?android.view.Window; ?? import?android.view.WindowManager; ?? import?android.view.SurfaceHolder.Callback; ?? public?class?SurfaceViewAcitvity?extends?Activity?{ ?? ????MyView?mAnimView?=?null; ?? ????@Override?? ????public?void?onCreate(Bundle?savedInstanceState)?{ ?? ????super.onCreate(savedInstanceState); ?? ????//?全屏顯示窗口??? ????requestWindowFeature(Window.FEATURE_NO_TITLE); ?? ????getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, ?? ????????WindowManager.LayoutParams.FLAG_FULLSCREEN); ?? ????//?顯示自定義的游戲View??? ????mAnimView?=?new?MyView(this); ?? ????setContentView(mAnimView); ?? ????} ?? ????public?class?MyView?extends?SurfaceView?implements?Callback,Runnable?{ ?? ?????/**每50幀刷新一次屏幕**/?? ????public?static?final?int?TIME_IN_FRAME?=?50; ?? ????/**?游戲畫(huà)筆?**/?? ????Paint?mPaint?=?null; ?? ????Paint?mTextPaint?=?null; ?? ????SurfaceHolder?mSurfaceHolder?=?null; ?? ????/**?控制游戲更新循環(huán)?**/?? ????boolean?mRunning?=?false; ?? ????/**?游戲畫(huà)布?**/?? ????Canvas?mCanvas?=?null; ?? ????/**控制游戲循環(huán)**/?? ????boolean?mIsRunning?=?false; ?? ????/**曲線(xiàn)方向**/?? ????private?Path?mPath; ?? ????private?float?mposX,?mposY; ?? ????public?MyView(Context?context)?{ ?? ????????super(context); ?? ????????/**?設(shè)置當(dāng)前View擁有控制焦點(diǎn)?**/?? ????????this.setFocusable(true); ?? ????????/**?設(shè)置當(dāng)前View擁有觸摸事件?**/?? ????????this.setFocusableInTouchMode(true); ?? ????????/**?拿到SurfaceHolder對(duì)象?**/?? ????????mSurfaceHolder?=?this.getHolder(); ?? ????????/**?將mSurfaceHolder添加到Callback回調(diào)函數(shù)中?**/?? ????????mSurfaceHolder.addCallback(this); ?? ????????/**?創(chuàng)建畫(huà)布?**/?? ????????mCanvas?=?new?Canvas(); ?? ????????/**?創(chuàng)建曲線(xiàn)畫(huà)筆?**/?? ????????mPaint?=?new?Paint(); ?? ????????mPaint.setColor(Color.BLACK); ?? ????????/**設(shè)置畫(huà)筆抗鋸齒**/?? ????????mPaint.setAntiAlias(true); ?? ????????/**畫(huà)筆的類(lèi)型**/?? ????????mPaint.setStyle(Paint.Style.STROKE); ?? ????????/**設(shè)置畫(huà)筆變?yōu)閳A滑狀**/?? ????????mPaint.setStrokeCap(Paint.Cap.ROUND); ?? ????????/**設(shè)置線(xiàn)的寬度**/?? ????????mPaint.setStrokeWidth(5); ?? ????????/**創(chuàng)建路徑對(duì)象**/?? ????????mPath?=?new?Path(); ?? ????????/**?創(chuàng)建文字畫(huà)筆?**/?? ????????mTextPaint?=?new?Paint(); ?? ????????/**設(shè)置顏色**/?? ????????mTextPaint.setColor(Color.BLACK); ?? ????????/**設(shè)置文字大小**/?? ????????mTextPaint.setTextSize(15); ?? ????} ?? ????@Override?? ????public?boolean?onTouchEvent(MotionEvent?event)?{ ?? ????????/**?拿到觸摸的狀態(tài)?**/?? ????????int?action?=?event.getAction(); ?? ????????float?x?=?event.getX(); ?? ????????float?y?=?event.getY(); ?? ????????switch?(action)?{ ?? ????????//?觸摸按下的事件??? ????????case?MotionEvent.ACTION_DOWN: ?? ????????/**設(shè)置曲線(xiàn)軌跡起點(diǎn)?X?Y坐標(biāo)**/?? ????????mPath.moveTo(x,?y); ?? ????????break; ?? ????????//?觸摸移動(dòng)的事件??? ????????case?MotionEvent.ACTION_MOVE: ?? ????????/**設(shè)置曲線(xiàn)軌跡**/?? ????????//參數(shù)1?起始點(diǎn)X坐標(biāo)??? ????????//參數(shù)2?起始點(diǎn)Y坐標(biāo)??? ????????//參數(shù)3?結(jié)束點(diǎn)X坐標(biāo)??? ????????//參數(shù)4?結(jié)束點(diǎn)Y坐標(biāo)??? ????????mPath.quadTo(mposX,?mposY,?x,?y); ?? ????????break; ?? ????????//?觸摸抬起的事件??? ????????case?MotionEvent.ACTION_UP: ?? ????????/**按鍵抬起后清空路徑軌跡**/?? ????????mPath.reset(); ?? ????????break; ?? ????????} ?? ???????//記錄當(dāng)前觸摸X?Y坐標(biāo)??? ????????mposX?=?x; ?? ????????mposY?=?y; ?? ????????return?true; ?? ????} ?? ????private?void?Draw()?{ ?? ????????/**清空畫(huà)布**/?? ????????mCanvas.drawColor(Color.WHITE); ?? ????????/**繪制曲線(xiàn)**/?? ????????mCanvas.drawPath(mPath,?mPaint); ?? ????????/**記錄當(dāng)前觸點(diǎn)位置**/?? ????????mCanvas.drawText("當(dāng)前觸筆?X:"?+?mposX,?0,?20,mTextPaint); ?? ????????mCanvas.drawText("當(dāng)前觸筆?Y:"?+?mposY,?0,?40,mTextPaint); ?? ????} ?? ????@Override?? ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width, ?? ????????int?height)?{ ?? ????} ?? ????@Override?? ????public?void?surfaceCreated(SurfaceHolder?holder)?{ ?? ????????/**開(kāi)始游戲主循環(huán)線(xiàn)程**/?? ????????mIsRunning?=?true; ?? ????????new?Thread(this).start(); ?? ????} ?? ????@Override?? ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{ ?? ????????mIsRunning?=?false; ?? ????} ?? ????@Override?? ????public?void?run()?{ ?? ????????while?(mIsRunning)?{ ?? ????????/**?取得更新游戲之前的時(shí)間?**/?? ????????long?startTime?=?System.currentTimeMillis(); ?? ????????/**?在這里加上線(xiàn)程安全鎖?**/?? ????????synchronized?(mSurfaceHolder)?{ ?? ????????????/**?拿到當(dāng)前畫(huà)布?然后鎖定?**/?? ????????????mCanvas?=?mSurfaceHolder.lockCanvas(); ?? ????????????Draw(); ?? ????????????/**?繪制結(jié)束后解鎖顯示在屏幕上?**/?? ????????????mSurfaceHolder.unlockCanvasAndPost(mCanvas); ?? ????????} ?? ????????/**?取得更新游戲結(jié)束的時(shí)間?**/?? ????????long?endTime?=?System.currentTimeMillis(); ?? ????????/**?計(jì)算出游戲一次更新的毫秒數(shù)?**/?? ????????int?diffTime?=?(int)?(endTime?-?startTime); ?? ????????/**?確保每次更新時(shí)間為50幀?**/?? ????????while?(diffTime?<=?TIME_IN_FRAME)?{ ?? ????????????diffTime?=?(int)?(System.currentTimeMillis()?-?startTime); ?? ????????????/**?線(xiàn)程等待?**/?? ????????????Thread.yield(); ?? ????????} ?? ????????} ?? ????} ?? ????} ?? }??
?????? 看懂并掌握了這些代碼實(shí)例后,相信大家對(duì)如何繪制游戲觸摸軌跡的曲線(xiàn)圖有了方法上的認(rèn)識(shí)了,希望大家在Android游戲開(kāi)發(fā)中自如的運(yùn)用它們。
與50位技術(shù)專(zhuān)家面對(duì)面 20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔 為你收集整理的Android游戏开发中绘制游戏触摸轨迹的曲线图 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。