如何使用加速计像iPhone OS上的迷宫游戏一样编程流畅运动?

时间:2010-02-16 12:56:04

标签: objective-c iphone math accelerometer

我希望能够使用加速计控制它来逼真地移动图像,就像任何迷宫游戏一样。下面显示了我到目前为止的情况,但它看起来非常紧张,根本不现实。球图像似乎永远无法停止,并且无处不在地进行大量的抖动。

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

deviceTilt.x = 0.01 * deviceTilt.x + (1.0 - 0.01) * acceleration.x;
deviceTilt.y = 0.01 * deviceTilt.y + (1.0 - 0.01) * acceleration.y;
}

-(void)onTimer {

    ballImage.center = CGPointMake(ballImage.center.x + (deviceTilt.x * 50), ballImage.center.y + (deviceTilt.y  * 50));

    if (ballImage.center.x > 279) {

        ballImage.center = CGPointMake(279, ballImage.center.y);
    }
    if (ballImage.center.x < 42) {

        ballImage.center = CGPointMake(42, ballImage.center.y);
    }
    if (ballImage.center.y > 419) {

        ballImage.center = CGPointMake(ballImage.center.x, 419);
    }
    if (ballImage.center.y < 181) {

        ballImage.center = CGPointMake(ballImage.center.x, 181);
    }

2 个答案:

答案 0 :(得分:3)

是否有一些原因导致您无法使用为回答上一个问题而提供的平滑过滤器:How do you use a moving average to filter out accelerometer values in iPhone OS

答案 1 :(得分:2)

您需要计算值的运行平均值。为此,您需要将最后n个值存储在数组中,然后在读取加速度计数据时从数组中推送和弹出值。这是一些伪代码:

const SIZE = 10;
float[] xVals = new float[SIZE];

float xAvg = 0;

function runAverage(float newX){
  xAvg += newX/SIZE;
  xVals.push(newX);
  if(xVals.length > SIZE){
    xAvg -= xVals.pop()/SIZE;
  }
}

您需要为所有三个轴执行此操作。玩弄SIZE的价值;它越大,值越平滑,但较慢的东西似乎会响应。这实际上取决于您读取加速度计值的频率。如果每秒读取10次,则SIZE = 10可能太大。