UIAccelerometer более чувствителен после калибровки?

Итак, я выполнил базовую калибровку в моей игре примерно так: Calibrate Code:

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

CalibreFloat устанавливается на значение, считанное из NSUserDefaults перед началом игры.

Затем в игровом цикле я делаю это:

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

Затем я устанавливаю положение моего изображения на основе поз.х. Это, однако, является проблемой: после калибровки чувствительность движения моего изображения очень высокая, что делает его очень быстрым движением. Перед калибровкой движение идет в хорошем темпе, поэтому что-то с калибровкой должно идти не так.

Здесь что-то не так, я делаю что-то не так с расчетами?

Спасибо!

1 ответ

Попробуйте добавить синхронизацию, просто чтобы убедиться, что вы написали правильное значение в NSUserDefaults:

Потому что вы не можете быть уверены, что ваши настройки записаны на диск до того, как вы их прочитаете, поэтому вам лучше заставить свое приложение записать это прямо сейчас

в яблочном доке:

синхронизация Записывает любые изменения в постоянные домены на диск и обновляет все неизмененные постоянные домены на то, что находится на диске.

  • (BOOL) синхронизировать возвращаемое значение 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!!!");
    }

}
Другие вопросы по тегам