2

だから私は自分のゲームで次のような基本的なキャリブレーションを行いました: コードのキャリブレーション:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    [[NSUserDefaults standardUserDefaults] setFloat:acceleration.x forKey:@"X-Calibrate"];
}

次に、私のゲーム ビューでは、これらは加速度計のいくつかの定義です。

#define kFilteringFactor 0.13
#define MAXXACCELERATION 24

ゲーム クラスの init メソッドで、次のようにします。

calibrationFloat = [[NSUserDefaults standardUserDefaults] floatForKey:@"X-Calibrate"];

次に、これを行います:

- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    //Low Pass Filter (gets rid of little jitters) + Calibration value combined
    rollingX = ((acceleration.x - calibrationFloat) * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
}

calibrationFloat は、ゲーム開始前に NSUserDefaults から読み取った値に設定されます。

次に、ゲームループでこれを行います:

int rollingAmount = (IS_IPAD() ? 52 : 44);
CGFloat xFloat = (rollingX * rollingAmount);
pos.x += xFloat < -MAXXACCELERATION ? -MAXXACCELERATION : (xFloat > MAXXACCELERATION ? MAXXACCELERATION : xFloat);

次に、pos.x に基づいて画像の位置を設定します。ただし、これが問題です。 キャリブレーション後、画像の動きの感度が非常に高くなり、動きが非常に速くなります。キャリブレーションする前は、動きは順調に進んでいるので、キャリブレーションで何か問題が発生しているに違いありません。

ここで何かが正しくないように見えますが、計算に何か問題がありますか?

ありがとう!

4

1 に答える 1

1

NSUserDefaults に正しい値を書き込んだことを確認するために、同期を追加してみてください。

設定を読み取る前に、設定がディスクに書き込まれていることを確認できないため、今すぐアプリに強制的に書き込むことをお勧めします

アップルドキュメントで:

synchronize 永続ドメインへの変更をディスクに書き込み、変更されていないすべての永続ドメインをディスク上の内容に更新します。

  • (BOOL)synchronize 戻り値 データがディスクに正常に保存された場合は YES、それ以外の場合は NO。

setDouble: の代わりに setFloat を使用してみてください (UIAccelerationValue x は double として定義されています...もちろん、後で読むときに doubleForKey: を使用します)

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    [[NSUserDefaults standardUserDefaults] setDouble:acceleration.x forKey:@"X-Calibrate"];
    if ([[NSUserDefaults standardUserDefaults] synchronize]) {
        NSLog(@"OK: well written!!!");
    }else {
        NSLog(@"NO! Error!!!");
    }

}
于 2012-12-05T16:25:25.653 に答える