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;
  }
}

3 つの軸すべてに対してこれを行う必要があります。SIZE の値をいじってみましょう。値が大きいほど値は滑らかになりますが、応答が遅くなります。加速度計の値を読み取る頻度に大きく依存します。1 秒あたり 10 回読み取られる場合は、SIZE = 10大きすぎる可能性があります。

于 2010-02-16T13:04:52.867 に答える