Android 重力传感器在游戏开发中的应用

手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性。本节将继续介绍智能手机的另一种神奇之处:传感器。

   一、何为传感器

所谓传感器就是能够探测如光、热、温度、重力、方向等等的装置。

   二、Android提供了哪些传感器

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

2、陀螺仪传感器

3、光传感器

4、恒定磁场传感器

5、方向传感器

6、恒定的压力传感器

7、接近传感器

8、温度传感器

今天我们给大家介绍的是游戏开发中最最常见的,用到的频率最高的一种传感--加速度传感器(重力传感器)!

三、传感器实例讲解

因为模拟器无法测试,所以我用手机调试的,先上两张截图:

下面贴代码:

Java代码

/**
 *@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;。

  总结

虽然本节只讲了重力传感器这一种,但已经足够了,因为如果你想使用其他的传感器,只要按以下步骤操作就可以:

1、利用 SensorManager.getDefaultSensor();传入一个你想要的传感器的参数得到其实例;

2、注册;

3、在监听器里处理事件。

其实并不难,你也可以让自己的游戏有各种感应效果了。

以上就对Android 重力传感器的资料整理,后续继续补充相关知识,谢谢大家对本站的支持!

(0)

相关推荐

  • Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import an

  • Android利用Sensor(传感器)实现指南针小功能

    首先来说一说该指南针的实现思路: 程序先准备一张指南针图片,该图片上方向指针指向北方.接下来开发一个检测方向的传感器,程序检测到手机顶部绕Z轴转过多少度,让指南针图片反向转多少度即可.由此可见指南针应用只要在界面中添加一张图片,并让图片总是反向转过反向传感器返回的第一个角度值即可. 下面介绍一下方向传感器:方向传感器用于感应手机设备的摆放状态.方向传感器可以返回三个角度,这三个角度即可确定手机的摆放状态.关于方向传感器返回的三个角度的说明如下. 第一个角度:表示手机顶部朝向正北方的夹角.当手机绕

  • Android利用Sensor(传感器)实现水平仪功能

    这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端. 利用方向传感器返回的第一个参数,实现了一个指南针小应用. 我的Android进阶之旅------>Android利用Sensor(传感器)实现指南针功能 接下来,我们利用返回的第二.三个参数实现该水平仪.因为第二个参数,反映底部翘起的角度(当顶部翘起时为负值),第三个参数可以反映右侧翘起的角度(当左侧翘起时为负值).根据这两个角度就可以开发水平仪,实现手机哪端翘起

  • Android 获取传感器列表整理及简单实例

    Android 获取传感器列表整理及简单实例 Android 4.4 (API等级19)支持以下传感器: TYPE_ACCELEROMETER 加速度传感器,单位是m/s2,测量应用于设备X.Y.Z轴上的加速度 传感器类型值(Sensor Type):1 (0x00000001) TYPE_AMBIENT_TEMPERATURE 温度传感器,单位是℃ 传感器类型值(Sensor Type): 13 (0x0000000d) TYPE_GAME_ROTATION_VECTOR 游戏动作传感器,不收

  • Android编程实现获取所有传感器数据的方法

    本文实例讲述了Android编程实现获取所有传感器数据的方法.分享给大家供大家参考,具体如下: main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" androi

  • Android重力传感器实现滚动的弹球

    熟知: 什么是传感器: 所谓传感器能够探测如光.热.温度.重力.方向 等等的功能! Android中提供传感器有哪些: 1.  加速度传感器(重力传感器)      2.  陀螺仪传感器      3.  光传感器      5.  恒定磁场传感器      6.  方向传感器      7.  恒定的压力传感器      8.  接近传感器      9.  温度传感器 一. 问题描述 Android中有多达11种传感器,不同的手机设备支持的传感器类型也不尽相同 1. 重力传感器 GV-sen

  • Android 传感器--光照传感器详解及使用

    Android 设备中有许多传感器,其中有一个传感器控制着你屏幕亮度的变化.当你在很暗的地方使用手机,你设备的屏幕会自动调暗,从而保护你眼睛. 起着这样作用,Android是通过一款光照传感器来获取你周围环境亮度的变化.光照传感器一般在手机的顶部的位置. 要在程序中使用这款传感器 (1)首先要获取SensorManager传感器管理器服务:SensorManager sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERV

  • Android利用传感器仿微信摇一摇功能

    传感器 简单的介绍一下传感器: 就是设备用来感知周边环境变化的硬件. Android中的传感器包含在传感器框架中,属于android.hardware.*(硬件部分) 传感器框架主要包含四个部分: ① SensorManager:用来获取传感器的入口,它是一个系统的服务,还可以为传感器注册与取消注册监听 ② Sensor: 具体的传感器,包含了传感器的名字,类型,采样率 ③ SensorEvent:传感器事件,包含了传感器采集回来的数据,传感器的精度 ④ SensorEventListener:

  • Android利用方向传感器获得手机的相对角度实例说明

    1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端. 将手机放在桌子上,z轴的方向是从手机指向天空. 2.方向传感器 在方向传感器中values变量的3个值都表示度数,它们的含义如下: values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度.0表示北(North):90表示东(East):180表示南(Sou

  • Android操作系统介绍之11种传感器

    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.接下来通过本文给大家介绍Android操作系统介绍之11种传感器. 在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用. #define SENSOR_TYPE_ACCELEROMETER 1 //加速度 #define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力 #define

  • Android利用传感器实现微信摇一摇功能

    本文实例为大家分享了Android微信摇一摇功能的实现方法,供大家参考,具体内容如下 import java.util.ArrayList; import java.util.List; import java.util.Random; import android.app.Activity; import android.app.Service; import android.content.res.Resources; import android.hardware.Sensor; impo

  • android 传感器(OnSensorChanged)使用介绍

    下面是API中定义的几个代表sensor的常量. Int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type. 加速度传感器 int TYPE_ALL A constant describing all sensor types. 所有类型 A constant describing all sensor types. int TYPE_GRAVITY A constant describing a grav

随机推荐