生活随笔
收集整理的這篇文章主要介紹了
【Android游戏开发十八】解放手指,利用传感器开发游戏!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本站文章均為?李華明Himi?原創,轉載務必在明顯處注明:
轉載自【黑米GameDev街區】?原文鏈接:?http://www.himigame.com/android-game/344.html
?
??? 前兩篇都是向大家介紹了很有意思的兩種手勢操作,嵌入我們游戲中,不得不說讓游戲的自由度、可玩性和趣味性都增色不少!那么今天繼續給大家介紹一亮點!傳感器!
?一:什么是傳感器:
??? 所謂傳感器能夠探測如光、熱、溫度、重力、方向 等等的功能!
?二:Android中提供傳感器有哪些:
??? 1. 加速度傳感器(重力傳感器)
??? 2. 陀螺儀傳感器
??? 3. 光傳感器
??? 5. 恒定磁場傳感器
??? 6. 方向傳感器
??? 7. 恒定的壓力傳感器
??? 8. 接近傳感器
??? 9. 溫度傳感器
???? 今天我們給大家介紹的是游戲開發中最最常見的,用到的頻率最高的一種傳感器,加速度傳感器(重力傳感器)!
??? 因為模擬器無法測試,所以我用手機調試的~,先上兩張截圖;
??
?
/** ??*@author?Himi ??*@Sensor?加速度傳感器?,也稱為重力傳感器? ??*@SDK?1.5(api?3)就支持傳感器了 ??*@解釋:此傳感器不僅對玩家反轉手機的動作可以檢測到,而且會根據反轉手機的程度,得到傳感器的值也會不同! ??*/ ?public?class?MySurfaceView?extends?SurfaceView?implements?Callback,?Runnable?{ ?????private?Thread?th?=?new?Thread(this); ?????private?SurfaceHolder?sfh; ?????private?Canvas?canvas; ?????private?Paint?paint; ?????private?SensorManager?sm; ?????private?Sensor?sensor; ?????private?SensorEventListener?mySensorListener; ?????private?int?arc_x,?arc_y;//?圓形的x,y位置 ?????private?float?x?=?0,?y?=?0,?z?=?0; ?????public?MySurfaceView(Context?context)?{ ?????????super(context); ?????????this.setKeepScreenOn(true); ?????????sfh?=?this.getHolder(); ?????????sfh.addCallback(this); ?????????paint?=?new?Paint(); ?????????paint.setAntiAlias(true); ?????????setFocusable(true); ?????????setFocusableInTouchMode(true); ?????????//通過服務得到傳感器管理對象? ?????????sm?=?(SensorManager)?MainActivity.ma.getSystemService(Service.SENSOR_SERVICE); ?????????sensor?=?sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//得到一個重力傳感器實例 ?????????//TYPE_ACCELEROMETER????加速度傳感器(重力傳感器)類型。 ?????????//TYPE_ALL??????????????描述所有類型的傳感器。 ?????????//TYPE_GYROSCOPE????????陀螺儀傳感器類型 ?????????//TYPE_LIGHT????????????光傳感器類型 ?????????//TYPE_MAGNETIC_FIELD???恒定磁場傳感器類型。 ?????????//TYPE_ORIENTATION??????方向傳感器類型。 ?????????//TYPE_PRESSURE?????????描述一個恒定的壓力傳感器類型 ?????????//TYPE_PROXIMITY????????常量描述型接近傳感器 ?????????//TYPE_TEMPERATURE??????溫度傳感器類型描述 ?????????mySensorListener?=?new?SensorEventListener()?{ ?????????????@Override ?????????????//傳感器獲取值發生改變時在響應此函數 ?????????????public?void?onSensorChanged(SensorEvent?event)?{//備注1? ?????????????????//傳感器獲取值發生改變,在此處理? ?????????????????x?=?event.values[0];?//手機橫向翻滾 ?????????????????//x>0?說明當前手機左翻?x<0右翻????? ?????????????????y?=?event.values[1];?//手機縱向翻滾 ?????????????????//y>0?說明當前手機下翻?y<0上翻 ?????????????????z?=?event.values[2];?//屏幕的朝向 ?????????????????//z>0?手機屏幕朝上?z<0?手機屏幕朝下 ?????????????????arc_x?-=?x;//備注2 ?????????????????arc_y?+=?y; ?????????????} ?????????????@Override ?????????????//傳感器的精度發生改變時響應此函數 ?????????????public?void?onAccuracyChanged(Sensor?sensor,?int?accuracy)?{ ?????????????????//?TODO?Auto-generated?method?stub ?????????????} ?????????}; ?????????sm.registerListener(mySensorListener,?sensor,?SensorManager.SENSOR_DELAY_GAME); ?????????//第一個參數是傳感器監聽器,第二個是需要監聽的傳感實例 ?????????//最后一個參數是監聽的傳感器速率類型:?一共一下四種形式 ?????????//SENSOR_DELAY_NORMAL??正常 ?????????//SENSOR_DELAY_UI??適合界面 ?????????//SENSOR_DELAY_GAME??適合游戲??(我們必須選這個呀?哇哈哈~) ?????????//SENSOR_DELAY_FASTEST??最快 ?????} ?????public?void?surfaceCreated(SurfaceHolder?holder)?{ ?????????arc_x?=?this.getWidth()?/?2?-?25; ?????????arc_y?=?this.getHeight()?/?2?-?25; ?????????th.start(); ?????} ?????public?void?draw()?{ ?????????try?{ ?????????????canvas?=?sfh.lockCanvas(); ?????????????if?(canvas?!=?null)?{ ?????????????????canvas.drawColor(Color.BLACK); ?????????????????paint.setColor(Color.RED); ?????????????????canvas.drawArc(new?RectF(arc_x,?arc_y,?arc_x?+?50, ?????????????????????????arc_y?+?50),?0,?360,?true,?paint); ?????????????????paint.setColor(Color.YELLOW); ?????????????????canvas.drawText("當前重力傳感器的值:",?arc_x?-?50,?arc_y-30,?paint); ?????????????????canvas.drawText("x="?+?x?+?",y="?+?y?+?",z="?+?z, ?????????????????????????arc_x?-?50,?arc_y,?paint); ?????????????????String?temp_str?=?"Himi提示:?"; ?????????????????String?temp_str2?=?""; ?????????????????String?temp_str3?=?""; ?????????????????if?(x?<?1?&&?x?>?-1?&&?y?<?1?&&?y?>?-1)?{ ?????????????????????temp_str?+=?"當前手機處于水平放置的狀態"; ?????????????????????if?(z?>?0)?{ ?????????????????????????temp_str2?+=?"并且屏幕朝上"; ?????????????????????}?else?{ ?????????????????????????temp_str2?+=?"并且屏幕朝下,提示別躺著玩手機,對眼睛不好喲~"; ?????????????????????} ?????????????????}?else?{ ?????????????????????if?(x?>?1)?{ ?????????????????????????temp_str2?+=?"當前手機處于向左翻的狀態"; ?????????????????????}?else?if?(x?<?-1)?{ ?????????????????????????temp_str2?+=?"當前手機處于向右翻的狀態"; ?????????????????????} ?????????????????????if?(y?>?1)?{ ?????????????????????????temp_str2?+=?"當前手機處于向下翻的狀態"; ?????????????????????}?else?if?(y?<?-1)?{ ?????????????????????????temp_str2?+=?"當前手機處于向上翻的狀態"; ?????????????????????} ?????????????????????if?(z?>?0)?{ ?????????????????????????temp_str3?+=?"并且屏幕朝上"; ?????????????????????}?else?{ ?????????????????????????temp_str3?+=?"并且屏幕朝下,提示別躺著玩手機,對眼睛不好喲~"; ?????????????????????} ?????????????????} ?????????????????paint.setTextSize(20); ?????????????????canvas.drawText(temp_str,?0,?50,?paint); ?????????????????canvas.drawText(temp_str2,?0,?80,?paint); ?????????????????canvas.drawText(temp_str3,?0,?110,?paint); ?????????????} ?????????}?catch?(Exception?e)?{ ?????????????Log.v("Himi",?"draw?is?Error!"); ?????????}?finally?{ ?????????????sfh.unlockCanvasAndPost(canvas); ?????????} ?????} ?????@Override ?????public?void?run()?{ ?????????//?TODO?Auto-generated?method?stub ?????????while?(true)?{ ?????????????draw(); ?????????????try?{ ?????????????????Thread.sleep(100); ?????????????}?catch?(Exception?ex)?{ ?????????????} ?????????} ?????} ?????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width,?int?height)?{ ?????} ?????public?void?surfaceDestroyed(SurfaceHolder?holder)?{ ?????} ?}? ?
?備注1:
??? SensorEventListener的onSensorChanged事件將返回SensorEvent對象,包含Sensor的最新數據,通過event.values獲得一個float[]數組!對于不同的傳感器類型,其數組包含的元素個數是不同的,重力傳感器總是返回一個長度為3的數組,分別代表X、Y和Z方向的數值。Z軸表示了手機是屏幕朝上還是屏幕朝下;
???? 這里還要注意你當前手機處于 縱向, 還是橫向,因為這個會影響我們的X,Y表示的意思!
如果當前手機是縱向屏幕:
x>0 說明當前手機左翻 x<0右翻
y>0 說明當前手機下翻 y<0上翻
如果當前手機是橫向屏幕:
x>0 說明當前手機下翻 x<0上翻
y>0 說明當前手機右翻 y<0左翻
?我要提醒各位童鞋:
??? 1.要考慮玩家當前拿手機的姿勢,例如豎屏,橫屏
??? 2.根據橫豎屏幕的不同,雖然屏幕坐標系會自動改變,但是傳感器的值不會自動改變坐標系!所以為什么會橫屏豎屏改變的時候我們從傳感器中取出的值表示的動作不一樣的原因!!!因此大家游戲開發的時候對于人物移動、圖片移動等等操作的時候,手勢X,Y的正負值代表什么一定要想清楚!否則玩家會玩著玩著吐的 (太暈了!)- -、
?備注2 :
??? 這里本應該arc_x+=x;但是因為當前我屏幕是縱向!造成x>0的手勢表示玩家將手機左翻了,但是我們屏幕的圓形應該根據人的反轉相對應的移動,那么這里玩家將手機左翻,我們就應該讓原型的X坐標減少!所以這里寫成了arc_x-=x;!
???? 總結一下: 對于傳感器的雖然本章只是講了一個重力傳感器,但是一個足夠了,因為如果你想使用其他的傳感器,那么你只要以下步驟就OK:
??? 1. 利用 SensorManager.getDefaultSensor();傳入一個你想要的傳感器的參數得到其實例!
??? 2.注冊!
???3.在監聽器里處理事件!
OK!就是這么簡單、
?源碼下載地址:?http://www.himigame.com/android-game/344.html
總結
以上是生活随笔為你收集整理的【Android游戏开发十八】解放手指,利用传感器开发游戏!的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。