国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 重力傳感器在游戲開發(fā)中的應(yīng)用

2019-12-12 05:34:58
字體:
供稿:網(wǎng)友

      手勢操作可以說是智能手機的一種魅力所在,前兩節(jié)給大家講解了兩種有趣的手勢操作,將它們置于游戲當(dāng)中,大大提升了游戲的可玩性和趣味性。本節(jié)將繼續(xù)介紹智能手機的另一種神奇之處:傳感器。

       一、何為傳感器

       所謂傳感器就是能夠探測如光、熱、溫度、重力、方向等等的裝置。

       二、Android提供了哪些傳感器

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

       2、陀螺儀傳感器

       3、光傳感器

       4、恒定磁場傳感器

       5、方向傳感器

       6、恒定的壓力傳感器

       7、接近傳感器

       8、溫度傳感器

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

       三、傳感器實例講解

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

        下面貼代碼:

Java代碼

/**  *@author Himi  *@Sensor 加速度傳感器 ,也稱為重力傳感器  *@SDK 1.5(api 3)就支持傳感器了  *@解釋:此傳感器不僅對玩家反轉(zhuǎn)手機的動作可以檢測到,而且會根據(jù)反轉(zhuǎn)手機的程度,得到傳感器的值也會不同!  */ 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);      //通過服務(wù)得到傳感器管理對象      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       //傳感器獲取值發(fā)生改變時在響應(yīng)此函數(shù)        public void onSensorChanged(SensorEvent event) {//備注1          //傳感器獲取值發(fā)生改變,在此處理          x = event.values[0]; //手機橫向翻滾          //x>0 說明當(dāng)前手機左翻 x<0右翻          y = event.values[1]; //手機縱向翻滾          //y>0 說明當(dāng)前手機下翻 y<0上翻          z = event.values[2]; //屏幕的朝向          //z>0 手機屏幕朝上 z<0 手機屏幕朝下          arc_x -= x;//備注2          arc_y += y;        }        @Override       //傳感器的精度發(fā)生改變時響應(yīng)此函數(shù)        public void onAccuracyChanged(Sensor sensor, int accuracy) {          // TODO Auto-generated method stub        }      };      sm.registerListener(mySensorListener, sensor, SensorManager.SENSOR_DELAY_GAME);      //第一個參數(shù)是傳感器監(jiān)聽器,第二個是需要監(jiān)聽的傳感實例      //最后一個參數(shù)是監(jiān)聽的傳感器速率類型: 一共一下四種形式      //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("當(dāng)前重力傳感器的值:", 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 += "當(dāng)前手機處于水平放置的狀態(tài)";            if (z > 0) {              temp_str2 += "并且屏幕朝上";            } else {              temp_str2 += "并且屏幕朝下,提示別躺著玩手機,對眼睛不好喲~";            }          } else {            if (x > 1) {              temp_str2 += "當(dāng)前手機處于向左翻的狀態(tài)";            } else if (x < -1) {              temp_str2 += "當(dāng)前手機處于向右翻的狀態(tài)";            }            if (y > 1) {              temp_str2 += "當(dāng)前手機處于向下翻的狀態(tài)";            } else if (y < -1) {              temp_str2 += "當(dāng)前手機處于向上翻的狀態(tài)";            }            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的最新數(shù)據(jù),通過event.values獲得一個float[]數(shù)組!對于不同的傳感器類型,其數(shù)組包含的元素個數(shù)是不同的,重力傳感器總是返回一個長度為3的數(shù)組,分別代表X、Y和Z方向的數(shù)值。Z軸表示了手機是屏幕朝上還是屏幕朝下。

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

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

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

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

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

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

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

       我要提醒各位童鞋:

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

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

       備注2:

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

       總結(jié)

       雖然本節(jié)只講了重力傳感器這一種,但已經(jīng)足夠了,因為如果你想使用其他的傳感器,只要按以下步驟操作就可以:

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

       2、注冊;

       3、在監(jiān)聽器里處理事件。

       其實并不難,你也可以讓自己的游戲有各種感應(yīng)效果了。

       以上就對Android 重力傳感器的資料整理,后續(xù)繼續(xù)補充相關(guān)知識,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 偃师市| 惠安县| 曲靖市| 株洲县| 安岳县| 北京市| 洛宁县| 陆良县| 宜春市| 左云县| 若尔盖县| 邛崃市| 海丰县| 游戏| 永州市| 长宁区| 观塘区| 九江市| 从化市| 长顺县| 福泉市| 天峻县| 准格尔旗| 高密市| 海城市| 合山市| 大同市| 清苑县| 阿拉善左旗| 蓬安县| 镇平县| 阿拉善右旗| 兖州市| 广饶县| 乌鲁木齐县| 武城县| 大洼县| 民权县| 西宁市| 大埔县| 滨海县|