所谓重力感应事件,其实,就是根据iPhone的硬件设备-陀螺仪,检测到设备的倾斜,加速度。从而,将倾斜,加速度值传递给iOS,做响应的处理。
其实,加速度计,并不陌生,我记得我有一篇博客还是专门将它的。有兴趣的同学,可以去翻阅,网上一箩筐!!
废话不说!直接贴代码:
重力感应事件的使用:
1.加入重力感应加速计的支持
-(id) init
{
if( (self=[super init])) {
// 初始化精灵代码:略
self.isAccelerometerEnabled = YES;// 设置为接受加速事件响应
[self scheduleUpdate];
}
return self;
}
2.实现UIAccelerometerDelegate协议方法
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration*)acceleration{
// 以下代码主要作用是:过滤加速计传入的值,这样,让加速计事件的响应更加平滑。
#define kFilteringFactor 0.1
#define kRestAccelY -0.6
#define kMaxDiffX 0.2
#define kMaxDiffY 0.2
#define kMaxPointsPerSecX (winSize.width*0.5)
#define kMaxPointsPerSecY (winSize.height*0.5)
UIAccelerationValue rollingX,rollingY;
// UIAccelerationValue rollingZ;
rollingX = (acceleration.x * kFilteringFactor) +(rollingX *(1.0 -kFilteringFactor));
rollingY = (acceleration.y * kFilteringFactor) +(rollingY *(1.0 -kFilteringFactor));
// rollingZ = (acceleration.z * kFilteringFactor) +(rollingZ *(1.0 - kFilteringFactor));
float accelX = acceleration.x - rollingX;
float accelY = acceleration.y - rollingY;
// float accelZ = acceleration.z - rollingZ;
CGSize winSize = [CCDirector sharedDirector].winSize;
float accelFractionX = accelX / kMaxDiffX;
float pointsPerSecX = kMaxPointsPerSecX * accelFractionX;
float accelDiffY = accelY - kRestAccelY;
float accelFractionY = accelDiffY /kMaxDiffY;
float pointsPerSecY = kMaxPointsPerSecY * accelFractionY;
// 获得X轴,Y轴方向上的运动速度
velocityX = pointsPerSecX;
velocityY = pointsPerSecY;
}
3.在update方法中,更新坐标。
-(void)update:(ccTime)delta{
CGSize winSize = [CCDirector sharedDirector].winSize;
//设置小球在横向和纵向的移动边界
float maxY = winSize.height -ball.contentSize.height/2;
float minY = ball.contentSize.height/2;
float maxX = winSize.width - ball.contentSize.width/2;
float minX = ball.contentSize.width/2;
//根据加速度数据计算出小球的最终y坐标,注意使用了一个简单的算法来确保小球不会超出边界
float newY = ball.position.y + (velocityY *delta);
newY = MIN(MAX(newY, minY),maxY);
//根据加速度数据计算出小球的最终x坐标,注意使用了一个简单的算法来确保小球不会超出边界
float newX = ball.position.x + (velocityX *delta);
newX = MIN(MAX(newX, minX),maxX);
//更新小球的位置
ball.position = ccp(newX,newY);
}
原理,So easy !