国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
【Android2D游戲開發(fā)十八】解放手指,利用傳感器開發(fā)游戲!(本文講解在SurfaceView中用重力傳感器控制圓球的各方向移動)

  前兩篇都是向大家介紹了很有意思的兩種手勢操作,嵌入我們游戲中,不得不說讓游戲的自由度、可玩性和趣味性都增色不少!那么今天繼續(xù)給大家介紹一亮點!傳感器!

一:什么是傳感器:

     所謂傳感器能夠探測如光、熱、溫度、重力、方向 等等的功能!

二:Android中提供傳感器有哪些:

     1.  加速度傳感器(重力傳感器)

     2.  陀螺儀傳感器

     3.  光傳感器

     5.  恒定磁場傳感器

     6.  方向傳感器

     7.  恒定的壓力傳感器

     8.  接近傳感器

     9.  溫度傳感器

今天我們給大家介紹的是游戲開發(fā)中最最常見的,用到的頻率最高的一種傳感器,加速度傳感器(重力傳感器)!


因為模擬器無法測試,所以我用手機(jī)調(diào)試的~,先上兩張截圖;


         

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. /** 
  2.  *@author Himi 
  3.  *@Sensor 加速度傳感器 ,也稱為重力傳感器  
  4.  *@SDK 1.5(api 3)就支持傳感器了 
  5.  *@解釋:此傳感器不僅對玩家反轉(zhuǎn)手機(jī)的動作可以檢測到,而且會根據(jù)反轉(zhuǎn)手機(jī)的程度,得到傳感器的值也會不同! 
  6.  */  
  7. public class MySurfaceView extends SurfaceView implements Callback, Runnable {  
  8.     private Thread th = new Thread(this);  
  9.     private SurfaceHolder sfh;  
  10.     private Canvas canvas;  
  11.     private Paint paint;  
  12.     private SensorManager sm;  
  13.     private Sensor sensor;  
  14.     private SensorEventListener mySensorListener;  
  15.     private int arc_x, arc_y;// 圓形的x,y位置  
  16.     private float x = 0, y = 0, z = 0;  
  17.     public MySurfaceView(Context context) {  
  18.         super(context);  
  19.         this.setKeepScreenOn(true);  
  20.         sfh = this.getHolder();  
  21.         sfh.addCallback(this);  
  22.         paint = new Paint();  
  23.         paint.setAntiAlias(true);  
  24.         setFocusable(true);  
  25.         setFocusableInTouchMode(true);  
  26.         //通過服務(wù)得到傳感器管理對象   
  27.         sm = (SensorManager) MainActivity.ma.getSystemService(Service.SENSOR_SERVICE);  
  28.         sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//得到一個重力傳感器實例  
  29.         //TYPE_ACCELEROMETER    加速度傳感器(重力傳感器)類型。  
  30.         //TYPE_ALL              描述所有類型的傳感器。  
  31.         //TYPE_GYROSCOPE        陀螺儀傳感器類型  
  32.         //TYPE_LIGHT            光傳感器類型  
  33.         //TYPE_MAGNETIC_FIELD   恒定磁場傳感器類型。  
  34.         //TYPE_ORIENTATION      方向傳感器類型。  
  35.         //TYPE_PRESSURE         描述一個恒定的壓力傳感器類型  
  36.         //TYPE_PROXIMITY        常量描述型接近傳感器  
  37.         //TYPE_TEMPERATURE      溫度傳感器類型描述  
  38.         mySensorListener = new SensorEventListener() {  
  39.             @Override  
  40.             //傳感器獲取值發(fā)生改變時在響應(yīng)此函數(shù)  
  41.             public void onSensorChanged(SensorEvent event) {//備注1   
  42.                 //傳感器獲取值發(fā)生改變,在此處理   
  43.                 x = event.values[0]; //手機(jī)橫向翻滾  
  44.                 //x>0 說明當(dāng)前手機(jī)左翻 x<0右翻       
  45.                 y = event.values[1]; //手機(jī)縱向翻滾  
  46.                 //y>0 說明當(dāng)前手機(jī)下翻 y<0上翻  
  47.                 z = event.values[2]; //屏幕的朝向  
  48.                 //z>0 手機(jī)屏幕朝上 z<0 手機(jī)屏幕朝下  
  49.                 arc_x -= x;//備注2  
  50.                 arc_y += y;  
  51.             }  
  52.             @Override  
  53.             //傳感器的精度發(fā)生改變時響應(yīng)此函數(shù)  
  54.             public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  55.                 // TODO Auto-generated method stub  
  56.             }  
  57.         };  
  58.         sm.registerListener(mySensorListener, sensor, SensorManager.SENSOR_DELAY_GAME);  
  59.         //第一個參數(shù)是傳感器監(jiān)聽器,第二個是需要監(jiān)聽的傳感實例  
  60.         //最后一個參數(shù)是監(jiān)聽的傳感器速率類型: 一共一下四種形式  
  61.         //SENSOR_DELAY_NORMAL  正常  
  62.         //SENSOR_DELAY_UI  適合界面  
  63.         //SENSOR_DELAY_GAME  適合游戲  (我們必須選這個呀 哇哈哈~)  
  64.         //SENSOR_DELAY_FASTEST  最快  
  65.     }  
  66.     public void surfaceCreated(SurfaceHolder holder) {  
  67.         arc_x = this.getWidth() / 2 - 25;  
  68.         arc_y = this.getHeight() / 2 - 25;  
  69.         th.start();  
  70.     }  
  71.     public void draw() {  
  72.         try {  
  73.             canvas = sfh.lockCanvas();  
  74.             if (canvas != null) {  
  75.                 canvas.drawColor(Color.BLACK);  
  76.                 paint.setColor(Color.RED);  
  77.                 canvas.drawArc(new RectF(arc_x, arc_y, arc_x + 50,  
  78.                         arc_y + 50), 0360true, paint);  
  79.                 paint.setColor(Color.YELLOW);  
  80.                 canvas.drawText("當(dāng)前重力傳感器的值:", arc_x - 50, arc_y-30, paint);  
  81.                 canvas.drawText("x=" + x + ",y=" + y + ",z=" + z,  
  82.                         arc_x - 50, arc_y, paint);  
  83.                 String temp_str = "Himi提示: ";  
  84.                 String temp_str2 = "";  
  85.                 String temp_str3 = "";  
  86.                 if (x < 1 && x > -1 && y < 1 && y > -1) {  
  87.                     temp_str += "當(dāng)前手機(jī)處于水平放置的狀態(tài)";  
  88.                     if (z > 0) {  
  89.                         temp_str2 += "并且屏幕朝上";  
  90.                     } else {  
  91.                         temp_str2 += "并且屏幕朝下,提示別躺著玩手機(jī),對眼睛不好喲~";  
  92.                     }  
  93.                 } else {  
  94.                     if (x > 1) {  
  95.                         temp_str2 += "當(dāng)前手機(jī)處于向左翻的狀態(tài)";  
  96.                     } else if (x < -1) {  
  97.                         temp_str2 += "當(dāng)前手機(jī)處于向右翻的狀態(tài)";  
  98.                     }  
  99.                     if (y > 1) {  
  100.                         temp_str2 += "當(dāng)前手機(jī)處于向下翻的狀態(tài)";  
  101.                     } else if (y < -1) {  
  102.                         temp_str2 += "當(dāng)前手機(jī)處于向上翻的狀態(tài)";  
  103.                     }  
  104.                     if (z > 0) {  
  105.                         temp_str3 += "并且屏幕朝上";  
  106.                     } else {  
  107.                         temp_str3 += "并且屏幕朝下,提示別躺著玩手機(jī),對眼睛不好喲~";  
  108.                     }  
  109.                 }  
  110.                 paint.setTextSize(20);  
  111.                 canvas.drawText(temp_str, 050, paint);  
  112.                 canvas.drawText(temp_str2, 080, paint);  
  113.                 canvas.drawText(temp_str3, 0110, paint);  
  114.             }  
  115.         } catch (Exception e) {  
  116.             Log.v("Himi""draw is Error!");  
  117.         } finally {  
  118.             sfh.unlockCanvasAndPost(canvas);  
  119.         }  
  120.     }  
  121.     @Override  
  122.     public void run() {  
  123.         // TODO Auto-generated method stub  
  124.         while (true) {  
  125.             draw();  
  126.             try {  
  127.                 Thread.sleep(100);  
  128.             } catch (Exception ex) {  
  129.             }  
  130.         }  
  131.     }  
  132.     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  133.     }  
  134.     public void surfaceDestroyed(SurfaceHolder holder) {  
  135.     }  
  136. }  
 

備注1:

      SensorEventListener的onSensorChanged事件將返回SensorEvent對象,包含Sensor的最新數(shù)據(jù),通過event.values獲得一個float[]數(shù)組!對于不同的傳感器類型,其數(shù)組包含的元素個數(shù)是不同的,重力傳感器總是返回一個長度為3的數(shù)組,分別代表X、Y和Z方向的數(shù)值。Z軸表示了手機(jī)是屏幕朝上還是屏幕朝下;

 

這里還要注意你當(dāng)前手機(jī)處于 縱向, 還是橫向,因為這個會影響我們的X,Y表示的意思!

     如果當(dāng)前手機(jī)是縱向屏幕:  

              x>0 說明當(dāng)前手機(jī)左翻 x<0右翻     

              y>0 說明當(dāng)前手機(jī)下翻 y<0上翻 

     如果當(dāng)前手機(jī)是橫向屏幕: 

             x>0 說明當(dāng)前手機(jī)下翻 x<0上翻     

             y>0 說明當(dāng)前手機(jī)右翻 y<0左翻  

 

我要提醒各位童鞋:

     1.要考慮玩家當(dāng)前拿手機(jī)的姿勢,例如豎屏,橫屏

     2.根據(jù)橫豎屏幕的不同,雖然屏幕坐標(biāo)系會自動改變,但是傳感器的值不會自動改變坐標(biāo)系!所以為什么會橫屏豎屏改變的時候我們從傳感器中取出的值表示的動作不一樣的原因?。?!因此大家游戲開發(fā)的時候?qū)τ谌宋镆苿?、圖片移動等等操作的時候,手勢X,Y的正負(fù)值代表什么一定要想清楚!否則玩家會玩著玩著吐的(太暈了!)- -、

 

備注2 :

      這里本應(yīng)該arc_x+=x;但是因為當(dāng)前我屏幕是縱向!造成x>0的手勢表示玩家將手機(jī)左翻了,但是我們屏幕的圓形應(yīng)該根據(jù)人的反轉(zhuǎn)相對應(yīng)的移動,那么這里玩家將手機(jī)左翻,我們就應(yīng)該讓原型的X坐標(biāo)減少!所以這里寫成了arc_x-=x;!

 

總結(jié)一下: 對于傳感器的雖然本章只是講了一個重力傳感器,但是一個足夠了,因為如果你想使用其他的傳感器,那么你只要以下步驟就OK:

1. 利用 SensorManager.getDefaultSensor();傳入一個你想要的傳感器的參數(shù)得到其實例!

2.注冊!

3.在監(jiān)聽器里處理事件!

OK!就是這么簡單、 

                                                             下一章講解粒子系統(tǒng)!

源碼下載地址:http://download.csdn.net/source/2985714

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android 通過創(chuàng)建一個位圖的XY Chart來學(xué)習(xí)Android繪圖類Rect,Paint,Bitm...
陀螺儀、加速計和磁力計
Andriod Sensor 架構(gòu)深入剖析
汽車-自動空調(diào)控制器技術(shù)規(guī)范
Android操作系統(tǒng)11種傳感器介紹
android 傳感器類 sensor
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服