手势摇动在MC中的实现方法(附Demo)

手势摇动的基本介绍:
手势摇动是手持设备检测用到的一个功能,这里简单介绍一下如何使用MC实现这个功能

首先介绍一下手势摇动的相关函数:

getAccel:

void getAccel(float *x,float *y, float *z);

功能:检测手机的放置状态,原理是将轴加速计三个轴的参数存入这里的x,y,z。

这三个参数构成的方向向量(x,y,z)指示的就是相对于地平面的手机的方向向量,其坐标系如下图所示:

<ignore_js_op>图片1.png

 

手机的方然后根据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

posted @ 2013-05-21 15:20  zj_king  阅读(337)  评论(0编辑  收藏  举报