手势摇动在MC中的实现方法(附Demo)
手势摇动的基本介绍:
手势摇动是手持设备检测用到的一个功能,这里简单介绍一下如何使用MC实现这个功能
首先介绍一下手势摇动的相关函数:
getAccel:
void getAccel(float *x,float *y, float *z);
功能:检测手机的放置状态,原理是将轴加速计三个轴的参数存入这里的x,y,z。
这三个参数构成的方向向量(x,y,z)指示的就是相对于地平面的手机的方向向量,其坐标系如下图所示:
<ignore_js_op>
手机的方然后根据x,y,z三个参数来判断手机的放置状态当手机处于缓慢移动的时候,x,y,z的范围是-10~0、0~10。
这个时候,其他外力大小可以忽略不计,那么各个分量方向的加速度大小都不会大于重力加速度。而当我们疯狂甩
动手机的时候,手机受到除了重力以外的外力,它的分量方向加速度就可能会大于10。然后我们来分析手机的放置
状态:
①当x=y=0时,手机处于水平放置状态。
②当x=0并且y>0时,手机顶部的水平位置要大于底部,也就是一般接听电话时手机所处的状态。
③当x=0并且y<0时,手机顶部的水平位置要小于底部。手机一般很少处于这种状态。
④当y=0并且x>0时,手机右侧的水平位置要大于左侧,也就是右侧被抬起。
⑤当y=0并且x<0时,手机右侧的水平位置要小于左侧,也就是左侧被抬起。
⑥当z=0时,手机平面与水平面垂直。
⑦当z>0时,手机屏幕朝上。
⑧当z<0时,手机屏幕朝下。
然而,上面的数据那只是理想状态下的情况,也就是说,手机水平放置的时候可以很准确的让x,y等于0。可是实际
情况下,手机的感应器并没有那么精确,它会有一点点误差,所以实际编程中,我们可以将水平放置情况下的取值
范围适当扩大一点,一般情况下,判断手机水平放置的取值范围应当扩大到-0.2到0.2。
在MC中的使用方法:可以使用计时器Timer来定时获取x、y、z方向上的加速度,并根据获取的加速度值做判断。
以下是在计时器Timer中的脚本代码:
float ax;
float ay;
float az;
//获取x、y、z方向上的加速度
getAccel(&ax,&ay,&az);
//显示x、y、z方向上的瞬时加速度值
sprintf(dis.text,"x= %.3f y= %.3f z = %.3f",ax,ay,az);
//可以根据加速度改变当前角色的位置
x -= ax;
y += ay;
//如果x、y方向上的加速度大于某个设定值时,认定为设备被摇动
if(ax < -10 || ax > 10||ay>10||ay<-10)
{
//摇动时的加速度值
sprintf(dis2.text,"摇动:x= %.3f y= %.3f z = %.3f",ax,ay,az);
//todo
}
具体使用方法请参考Demo:http://www.dongyo.cn/bbs/forum.php?mod=viewthread&tid=3716&extra=page%3D1