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

Итак, я сделал базовую калибровку в своей игре следующим образом: Откалибруйте код:

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

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

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

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

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

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

Спасибо!


person SimplyKiwi    schedule 28.11.2012    source источник
comment
для калибровки установлено значение, считанное из NSUserDefaults. Я не вижу calibrationValue нигде в вашем коде.   -  person Victor Zamanian    schedule 02.12.2012
comment
Я добавил это. Извини за это! :)   -  person SimplyKiwi    schedule 02.12.2012
comment
Хорошо, без проблем. Однако я до сих пор не вижу, чтобы эта переменная использовалась где-либо. Вы имеете в виду calibrationFloat или это две разные переменные? (Кроме того, я видел, что вы задали связанный с этим вопрос, где в ответе говорилось, что вы неправильно вычисляли rollingX. Вы полностью это исключили?)   -  person Victor Zamanian    schedule 02.12.2012
comment
Да, в моем вопросе использовалась неправильная переменная, я обновил ее. Этот ответчик был для этого вопроса: Однако он не дал достаточно конкретного ответа о том, как исправить вычисление rollX. Также я знаю, что он говорит откалибровать по шкале 3D, но в этом случае меня волнует только ось X. Так что нет, я не исправил ошибку вычисления RollingX, потому что я не уверен, где ошибка и как ее исправить.   -  person SimplyKiwi    schedule 02.12.2012
comment
Где вы инициализируете rollingX в первый раз?   -  person Victor Zamanian    schedule 02.12.2012
comment
В классе игры fakeInit (fakeInit — это метод, похожий на половинную инициализацию, где он берет объекты, которые уже созданы, и изменяет их установленные значения на 0 и т. д., но вызывается только во второй раз, когда загружается представление игры). Итак, в fakeInit я делаю: rollX = 0;   -  person SimplyKiwi    schedule 02.12.2012
comment
Хорошо. Мне было интересно, был ли rollingX неинициализирован и заставлял вас получать большие значения для xFloat. Но если rollingX инициализируется 0 перед вычислениями, то это не должно быть проблемой. Единственное, что я сразу вижу, это то, что acceleration.x на самом деле является double, но это тоже не должно иметь большого значения. Так что, боюсь, у меня закончились идеи. Прости. :-\   -  person Victor Zamanian    schedule 02.12.2012
comment
Черт, ты уверен, что понятия не имеешь, почему мои расчеты неверны и для rollX? Я думаю, что это основа проблемы, и мы можем работать оттуда.   -  person SimplyKiwi    schedule 02.12.2012
comment
Боюсь, у меня закончились идеи. :/ Думаю, в этом случае мне придется просмотреть всю вашу кодовую базу, чтобы лучше понять. Но на вашем месте я бы начал записывать различные значения в консоль, чтобы увидеть, где именно генерируются эти большие ускорения. Так вы сможете более точно отследить проблему.   -  person Victor Zamanian    schedule 02.12.2012


Ответы (1)


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

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

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

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

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

}
person meronix    schedule 05.12.2012
comment
К сожалению, проблема не в этом, значение правильное, просто мои расчеты кажутся неверными, и я не уверен, какими они должны быть. - person SimplyKiwi; 06.12.2012