Android姿态传感器在手机游戏开发中的应用

时间:2022-09-15 09:29:05

Android姿态传感器在手机游戏开发中的应用

摘 要:本文阐述了如何采用Android姿态传感器技术对传统的小球闯关游戏进行二次开发,二次开发后的游戏的玩法从原来的手机按键或者触摸操作方式改为更加自由的甩、摇、转等空间操作方式,这种创新的游戏操作方式可以给游戏玩家带来更好的体验。

关键词:Android;姿态传感器;手机游戏

中图分类号:TP393.09;TN929.53

过去,尽管Android SDK开发环境能在移动开发人员和手机设备之间建立沟通桥梁,但是要访问手机底层硬件还是让移动开发人员感到非常棘手。随着Android开发团队对Android SDK的不断升级更新,手机设备的许多硬件功能不断浮出水面,开发人员越来越欣喜的发现可以在手机设备内部访问一些“好工具”,比如:手机中的“传感器”。

Android平台下的传感器包括加速度传感器(Accelerometer)、姿态传感器(Orientation)、磁场传感器(Magnetic、Field)和光传感器(Light)等,利用传感器可以开发出很多新奇有趣的小游戏。

随着手机游戏玩家对于手机游戏的创新体验有越来越高的要求,传统的游戏操作方式已经很难吸引玩家。因此可以利用Android平台下的各种传感器来创新开发一些新颖有趣的游戏,其中姿态传感器在开发手机游戏中是应用最为广泛的一种。

1 Android姿态传感器原理简介

Android姿态传感器主要感应手机方位的变化,捕获的是三个方位的参数,分别代表手机沿Yaw轴、Pitch轴和Roll轴转过的角度,如图1所示。Yaw轴、Pitch轴和Roll轴与平时理解的标准空间坐标系是有所区别的。

图1 Android姿态传感器原理

Yaw轴是三个轴中最简单的一个,其表示的方向是不变的,其方向一直是与重力加速度g的方向相反,即一直是竖直向上的,与手机的姿态无关。

Pitch轴的方向永远与Yaw轴成90度角,因此其方向会随着手机沿Yaw轴旋转而改变,图1表示了该轴的方向。事实上Yaw轴与Pitch轴相当于焊在一起的一个90度支架,无论手机怎么旋转,其与Yaw轴的角度都为90度。

Roll轴的方向是沿着手机屏幕向上的,在图1中可以看到,无论手机是何种姿态,Roll轴始终沿着手机的屏幕向上,其方向是与手机绑定的。由于Roll轴的方向与手机之间的关系是固定的,所以手机围绕Yaw轴或Pitch轴转动的过程中,Roll轴也会跟随手机一起转动,而并不是保持与标准空间坐标系中Y轴相同的方向。

上述介绍的是手机旋转过程中姿态传感器如何定位,那么姿态传感器在Android手机中如何工作呢?Android手机提供了内置姿态传感器的驱动程序,移动开发人员可以调用相应的驱动程序获得相应的数据,从而来判断手机的姿态。

2 Android姿态传感器在小球闯关游戏二次开发中的应用

Android姿态传感器技术在小球闯关游戏二次开发中主要应用在手机姿态计算模块,该模块的功能就是捕获手机姿态,并根据收到的数据计算出小球的运动方向。

2.1 捕获传感器数据

本游戏中,捕获传感器数据的类是BallListener类,BallListrener类是SensorListener的子类,其主要功能是对手机的姿态变化进行监听并获取相应的变化数据。SensorListener是Android系统中的内置类,它的主要功能是,当手机中传感器发生变化时,接收来自传感器的值。它提供了一个onSensorChanged方法,用来读取来自传感器的数据。

图2 BallListener类图

BallListener类包含三个成员变量father、startTime和timeSpan,如图2所示。其中startTime是用来记录开始游戏的时间,timeSpan是获取传感器数据的时间间隔。当系统当前时间减去开始时间等于timeSpan的值时,就获取手机姿态数据进行计算。

BallListener类包括四个成员方法,如图2所示。

BallListener方法是类的构造方法,主要功能是在其中初始化成员变量。

onSensorChanged方法是重写父类SensorListener的onSensorChanged方法,在该方法中每个固定的时间获取手机姿态数据,并调用analysisData方法进行计算。其实现代码如下:

public void onSensorChanged(int sensor,float[]values){//重写onSensorChanged方法

long now=System.currentTimeMillis(); //获取系统当前时间

if(now-startTime>=timeSpan){ //判断是否走过指定的时间间隔

if(sensor==SensorManager.SENSOR_ORIENTATION){

analysisData(values); //调用analysisData方法对数据进行分析

}

startTime=now; //重新计时

}

}

analysisData方法主要功能是获取values数组进行修正,并调用RotateUtil类的getDirectionCase方法计算出小球的运动方向。其实现代码如下:

//对读取的姿态数据进行分析,调用RoateUtil的静态方法解析出方向

public void analysisData(float[] values){

//对y轴进行修正

double[]valuesTemp=new double[]{values[0],-values[1],values[2]};

//调用RotateUtil的静态方法计算出小球方向

father.gv.direction=RotateUtil.getDirectionCase(valuesTemp);

}

2.2 计算小球的运动方向

在BallListener类的analysisData方法中,调用了RotateUtil类的getDirectionCase方法。RotateUtil类的主要功能是对捕获的手机姿态数据进行计算得出小球的运动方向,RotateUtil类图如图3所示。

图3 RotateUtil类图

RotateUtil类是静态工具类,提供了静态方法用来计算小球的运动方向。

XRotate方法的功能是为制定向量沿X轴旋转指定角度,返回值为旋转后的向量。其实现的代码下:

public static double[] XRotate(double angle,double[]gVector){

double[][]matrix={//绕x轴旋转变换矩阵

{1,0,0,0},

{0,Math.cos(angle),Math.sin(angle),0},

{0,-Math.sin(angle),Math.cos(angle),0},

{0,0,0,1}

};

double[]tempDot={gVector[0],gVector[1],gVector[2],gVector[3]};

for(int j=0;j

gVector[j]=(tempDot[0]*matrix[0][j]+tempDot[1]*matrix[1][j]+

tempDot[2]*matrix[2][j]+tempDot[3]*matrix[3][j]);

}

return gVector;

}

YRotate方法的功能是为制定向量沿Y轴旋转指定角度,返回值为旋转后的向量。其实现的代码如下:

ZRotate方法的功能是为制定向量沿Z轴旋转指定角度,返回值为旋转后的向量。其实现的代码如下:

getDirectionCase方法的功能是计算小球的运动方向。其首先将监听器捕获的传感器数据从角度值转换为弧度值,然后虚拟出一个从坐标系原点出发的重力加速度向量,并且分别调用上述三个方法,将Yaw轴、Pitch轴和Roll轴恢复。最后根据获取的重力向量投影点在X-Y平面上的位置得出小球的运动方向,其关键代码如下:

在这里需要注意沿三个空间方向X,Y,Z轴所旋转的角度的恢复顺序。由于Yaw轴始终指向竖直向上(重力加速度反向),和标准的空间坐标系的Z轴一样,所以可以通过负向旋转直接进行角度恢复。沿Yaw轴将转过的角度恢复后,此时的Pitch轴就变成了空间坐标系中的X轴。沿Pitch(X)轴将转过的角度恢复后,此时的Roll轴就修正为了空间坐标系中的Y轴。最后按照Roll(Y)轴将转过的角度恢复后,则此时手机平面所在的平面变成了空间坐标系中X-Y平面,而附着于手机平面上的重力加速度则是一个与手机平面相交的向量,将该向量投影到手机平面,通过投影点就可以计算出小球要运动的方向。

如果不按照上述顺序进行角度恢复,则空间坐标的计算转换将会非常复杂,而上述方法中每一步的角度恢复都是基于标准的坐标系轴,对标准坐标系轴的转换在计算机图形学中很容易实现。

3 结束语

作者在对传统小球闯关游戏进行二次开发过程中,将Android姿态传感器技术应用到开发中,实现了游戏玩法的更新升级。正如文中提到了Android平台下的传感器远不止姿态传感器一种,还有加速度传感器、磁场传感器、光传感器等。随着Android平台硬件的不断升级,会有更多的传感器可以供移动开发人员访问,相信若能利用好这些我们日常生活中看不见摸不着的传感器,能使得我们的Android应用软件体验更加精彩。

参考文献:

[1]韩超.Android核心原理和系统集成应用高级开发[M].北京:电子工业出版社,2012.

[2]苏令朋.基于Android平台的3D游戏――星空迷途的设计和实现[D].电子科技大学,2013.

[3]程展传.基于Android平台的传感器技术应用研究[D].华南理工大学,2011.

作者简介:吴丽(1981.12-),女,湖南长沙人,讲师,硕士,研究方向:软件开发。

作者单位:无锡科技职业学院,江苏无锡 214028

上一篇:基于业务流程的SG―ERP自动化测试技术研究与应... 下一篇:计算机网络安全探究与防范对策