Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75130
  • 博文数量: 48
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 340
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-30 14:22
文章分类

全部博文(48)

文章存档

2014年(47)

2013年(1)

我的朋友

分类: Android平台

2014-02-13 17:49:37

  Android游戏开发重力感应主要是依靠手机的加速度传感器(accelerometer)来实现

  在Android游戏开发中一共有八种传感器但是不一定每一款真机都支持这些传感器。因为很多功能用户根本不care的所以可能开发商会把某些功能屏蔽掉。还是得根据真机的实际情况来做开发,今天我们主要来讨论中加速度传感器的具体实现方式。

  传感器名称如下:

  加速度传感器(accelerometer)

  陀螺仪传感器(gyroscope)

  环境光照传感器(light)

  磁力传感器(magnetic field)

  方向传感器(orientation)

  压力传感器(pressure)

  距离传感器(proximity)

  温度传感器(temperature)

  1.SensorMannager传感器管理对象

  手机中的所有传感器都须要通过SensorMannager来访问,调用getSystemService(SENSOR_SERVICE)方法就可以拿到当前手机的传感器管理对象。

  SensorManager mSensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);

  复制代码

  2.实现SensorEventListener接口

  说道SensorEventListener接口就不得不说SensorListener接口。在Android1.5一下是通过实现SensorListener接口来捕获 手机传感器状态,但是在1.5以上如果实现这个接口系统会提示你这行代码已经过期。今天我们不讨论SensorListener因为它已经是过时的东西了。主要讨论一下SensorEventListener接口。我们须要实现SensorEventListener这个接口 onSensorChanged(SensorEvent event)方法来捕获手机传感器的状态,拿到手机 XYZ轴三个方向的重力分量,有了这三个方向的数据重力感应的原理我们就已经学会了,简单吧

  public void onSensorChanged(SensorEvent e) {

  float x = e.values[SensorManager.DATA_X];

  float y = e.values[SensorManager.DATA_Y];

  float z = e.values[SensorManager.DATA_Z];

  }

  复制代码

  如图所示:上例代码中 float x y z 3个方向的取值范围是在 -10 到 10 之间,我向同学们说明一下 X轴 Y轴 Z轴 重力分量的含义。 这里须要注意的是坐标原点 向天空为正数 向地面为负数 刚好与编程时坐标是相反的。

  手机屏幕向左侧方当X轴就朝向天空,垂直放置 这时候 轴 与 Z轴没有重力分量,因为X轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(1000)

  手机屏幕向右侧方当X轴就朝向地面,垂直放置 这时候 轴 与 Z轴没有重力分量,因为X轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(-1000)

  手机屏幕垂直竖立放置方当Y轴就朝向天空,垂直放置 这时候 轴 与 Z轴没有重力分量,因为Y轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0100)

  手机屏幕垂直竖立放置方当Y轴就朝向地面,垂直放置 这时候 轴 与 Z轴没有重力分量,因为Y轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0-100)

  手机屏幕向上当Z轴就朝向天空,水平放置 这时候 轴与Y轴没有重力分量,因为Z轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0010)

  手机屏幕向上当Z轴就朝向地面,水平放置 这时候 轴与Y轴没有重力分量,因为Z轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(00-10)

  3.注册SensorEventListener

  使用SensorMannager调用getDefaultSensor(Sensor.TYPE_ACCELEROMETER)方法拿到加速重力感应的Sensor对象。因为本章我们讨论重力加速度传感器所以参数为Sensor.TYPE_ACCELEROMETER,如果须要拿到其它的传感器须要传入对应的名称。使用SensorMannager调用registerListener()方法来注册,第三个参数是检测的灵敏精确度根据不同的需求来选择精准度,游戏开发建议使用 SensorManager.SENSOR_DELAY_GAME

  、mSensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);

  、mSensor = mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

  // 注册listener,第三个参数是检测的精确度

  //SENSOR_DELAY_FASTEST 最灵敏 因为太快了没必要使用

  //SENSOR_DELAY_GAME 游戏开发中使用

  //SENSOR_DELAY_NORMAL 正常速度

  //SENSOR_DELAY_UI 最慢的速度

  mSensorMgr.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);

  复制代码

重力感应简单速度计算的方式。 每次摇晃手机计算出 X轴 Y轴 Z轴的重力分量可以将它们记录下来 然后每次摇晃的重力分量和之前的重力分量可以做一个对比 利用差值和时间就可以计算出他们的移动速度。

private SensorManager sensorMgr;

  Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

  //保存上一次 x y z 的坐标

  float bx = 0;

  float by = 0;

  float bz = 0;

  long btime = 0;//这一次的时间

  sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);

  SensorEventListener lsn = new SensorEventListener() {

  public void onSensorChanged(SensorEvent e) { 

  float x = e.values[SensorManager.DATA_X];

  float y = e.values[SensorManager.DATA_Y];

  float z = e.values[SensorManager.DATA_Z];

  //在这里我们可以计算出 X Y Z的数值 下面我们就可以根据这个数值来计算摇晃的速度了

  //我想大家应该都知道计算速度的公事 速度 路程/时间

  //X轴的速度

  float speadX = (x - bx) / (System.currentTimeMillis() - btime);

  //y轴的速度

  float speadY = (y - by) / (System.currentTimeMillis() - btime);

  //z轴的速度

  float speadZ = (z - bz) / (System.currentTimeMillis() - btime);

  //这样简单的速度就可以计算出来 如果你想计算加速度 也可以 在运动学里,加速度a与速度,

  //位移都有关系:Vt=V0+atS=V0*t+1/2at^2, S=(Vt^2-V0^2)/(2a),根据这些信息也可以求解a

  //这里就不详细介绍了 公事 应该初中物理课老师就教了呵呵~~

  bx = x;

  by = y;

  bz = z;

  btime = System.currentTimeMillis();

  }

  public void onAccuracyChanged(Sensor s, int accuracy) {

  }

  };

  // 注册listener,第三个参数是检测的精确度

  sensorMgr.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME);

阅读(417) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~