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!!!");
}
}