4

我希望能够通过加速度计控制图像来逼真地移动图像,就像任何迷宫游戏一样。下面显示了我到目前为止所拥有的,但它看起来很紧张,根本不现实。球的图像似乎永远无法停止,并且到处都在做很多紧张的动作。

- (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);
    }
4

2 回答 2

3

您是否有某些原因不能使用针对您之前的问题提供的平滑过滤器:您如何使用移动平均值过滤 iPhone OS 中的加速度计值

于 2010-02-16T13:11:02.613 回答
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可能太大。

于 2010-02-16T13:04:52.867 回答