Accelerometer-Cocos2d中的重力感应事件

所谓重力感应事件,其实,就是根据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 !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值