Accelerometer(加速器)

加速器是用来测量某些设备上的三个轴的加速度(很多Android是集成了加速器的)。通过这个加速度,我们可以得到设备的倾斜数据或者说方向。

加速度的单位是(m/s2)。如果一个轴直接指向地球的中心,它的加速度将是大约10 m/s2。如果它指向相反的方向,那么加速度就是-10 m/s2

Android设备的坐标系如下图:

libgdx Input

悲剧的是,这种配置和平板电脑的不一样。 Android设备有一个概念叫做默认的方向。手机,直立模式(如上面的图片)是默认的方向。但平板电脑,横向才是默认的方向。默认横向的设备将坐标轴旋转了,因此Y轴用来表示比较窄的一边,而X轴是来表示宽的一边。

Libgdx会很仔细的处理这个问题,并如上图的坐标系取得加速器的读书,无论是设备默认横放还是竖放(正z轴是从屏幕出来的方向,x轴指向设备宽的一边,y轴点指向设备窄的一边)沿着更广泛的设备侧。

检查加速器是否可用

不同的Android设备有不同的硬件配置。我们需要检查设备是否支持加速器,可以用如下的代码:

boolean available = Gdx.input.isPeripheralAvailable(Peripheral.Accelerometer);

 查询当前或原始方向

如果你的游戏需要知道当前设备的方向,你可以使用如下的代码:

int orientation = Gdx.input.getOrientation();

这个方法会返回一个0,90,180,270,表示当前方向和原始方向的角度差。

原始的方向可以是横向(大部分平板电脑)或竖向(如上图)。我们可以这样查询:

Orientation nativeOrientation = Gdx.input.getNativeOrientation();

这个方法返回Orientation.Landscape或Orientation.Portrait,表示横向和竖向。

加速度读取

加速器的读书只能通过以下libgdx的轮询方法访问到:

float accelX = Gdx.input.getAccelerometerX();
float accelY = Gdx.input.getAccelerometerY();
float accelZ = Gdx.input.getAccelerometerZ();

如果设备不支持加速器,那么会返回0。

libgdx有一个demo演示了如何使用加速器:Super Jumper

方向矩阵

如果你想利用设备的方向数据来处理不同的渲染,那么使用方向矩阵能得到更好的效果。具体可以看官方的API。你可以把返回的矩阵信息作为参数直接传给OpenGL来渲染:

Matrix4 matrix = new Matrix4();
Gdx.input.getRotationMatrix(matrix.val);
// use the matrix, Luke

 

Compass(罗盘仪)

有些Android设备集成了磁场感应器,也就是俗称的指南针,能够得到设备当前在磁场方向的朝向。

我们可以通过如下方法检测设备是否支持罗盘仪:

boolean compassAvail = Gdx.input.isPeripheralAvailable(Peripheral.Compass);

如果你已经知道罗盘仪功能已经开启,那么你可以查询当前状态:

float azimuth = Gdx.input.getAzimuth();
float pitch = Gdx.input.getPitch();
float roll = Gdx.input.getRoll();

返回的数据会以度为单位。以下是关于这些数值的解释:

  • azimuth 用来表示z轴,正向是指向地球的中心。
  • pitch 表示x轴,正向会粗略的指向西面,并且与z轴和y轴是相互垂直的。
  • roll 就是y轴, 正向指向地球磁场的北面,并且与其他两个轴垂直。
以下是相对于地球的坐标系:

Vibrator(振动器)

亲,别想歪了。这东西不是严格意义上的输入设备,而是一种外围设备。我们暂且把它归为输入模块。

振动器允许你将手机振动起来。这可以实现一些游戏手柄的振动反馈功能。

振动器只有Android设备上能使用,而且需要在manifest文件中的声明“android.permission.VIBRATE”。如果您不知道如何在你的Android配置权限,请参阅“应用程序配置”部分。

你可以通过以下代码让手机振动:

Gdx.input.vibrate(2000);

参数的单位是毫秒,以上代码就能让手机振动2秒。

另一个方法可以提供稍微复杂点的振动:

Gdx.input.vibrate(new long[] { 0, 200, 200, 200}, -1);

这样会把振动器打开200毫秒,然后关闭200毫秒,然后又打开200毫秒。第二个参数表示是否需要重复执行。具体可以参考API文档

 

欢迎交流,转载请保留出处:爱撸小杰