Я хочу вычислить колеблющееся значение смещения на основе текущего времени в секундах, чтобы любой объект мог вызвать этот метод и получить возвращаемое смещение, синхронизированное с любым другим объектом, вызывающим тот же метод.
Это мой установщик для свойства locationOffset:
- (float)locationOffset
{
float currentTime = [[NSDate date] timeIntervalSince1970];
locationOffset = sinf(currentTime);
CCLOG(@"--- current time = %1.9f, location offset = %1.1f", currentTime, locationOffset);
return locationOffset;
}
Я называю это 60 Гц, и результат выглядит так:
--- current time = 1316013568.000000000, location offset = -0.1
...и так и осталось. Должно ли все после запятой равняться нулю?
Я ожидаю, что смогу отрегулировать частоту, масштабируя currentTime и «длину волны», масштабируя offsett, но мне просто нужно, чтобы мое синусоидальное locationOffset качалось вперед и назад в зависимости от времени.
Кажется, что смещение местоположения должно циклически изменяться от -1 до 1 каждые 2 пи секунды.
РЕДАКТИРОВАТЬ: Добавление метода, который теперь работает как надо.
- (float)locationOffset
{
double currentTime = [[NSDate date] timeIntervalSinceReferenceDate];
locationOffset = sin(2.0f*currentTime) * 12.0f;
// CCLOG(@"--- current time = %1.9f, location offset = %1.1f", currentTime, locationOffset);
return locationOffset;
}
Он повторяется каждые пи секунд и имеет величину +/- 12.
NSTimeInterval
), так как вы теряете точность (NSTimeInterval
сопоставляется сdouble
). - person DarkDust   schedule 14.09.2011float
содержит только около 6 значащих цифр. Вероятно, вам следует получить двойное значение и вычесть некоторое постоянное число, кратное 2pi, чтобы получить его в диапазонеfloat
с некоторой дробной точностью, или же использовать двойную формуsin
. - person Hot Licks   schedule 14.09.2011