Разве это не должно давать мне текущую дату/время в секундах?

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

Это мой установщик для свойства 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.


person Steve    schedule 14.09.2011    source источник
comment
Как вы называете этот метод? Это должно работать нормально, даже если вы должны использовать правильный тип (NSTimeInterval), так как вы теряете точность (NSTimeInterval сопоставляется с double).   -  person DarkDust    schedule 14.09.2011
comment
У меня есть объект (подкласс CCSprite), который вызывает это. Если он находится в правильном состоянии (или движется туда), он вызовет это и добавит смещение к своей позиции. Этот (потенциальный) вызов может происходить 60 раз в секунду в методе CCLayer -update.   -  person Steve    schedule 14.09.2011
comment
Вы показываете нам всю функцию???   -  person Hot Licks    schedule 14.09.2011
comment
(По моим подсчетам, эта дата соответствует 1974 году.) [Ой, должно быть, пропустили цифру — это дата 2011 года.]   -  person Hot Licks    schedule 14.09.2011
comment
Просто для улыбки попробуйте вместо этого использовать timeIntervalSinceReferenceDate. Интересно, ограничено ли timeIntervalSince1970 целыми секундами.   -  person Hot Licks    schedule 14.09.2011
comment
Также имейте в виду, что float содержит только около 6 значащих цифр. Вероятно, вам следует получить двойное значение и вычесть некоторое постоянное число, кратное 2pi, чтобы получить его в диапазоне float с некоторой дробной точностью, или же использовать двойную форму sin.   -  person Hot Licks    schedule 14.09.2011


Ответы (1)


Да, ваша проблема в том, что значение float имеет только около 7 значащих цифр. У вас даже нет достаточной точности, чтобы правильно выразить целочисленное значение 1316013568, поэтому вы эффективно вводите одно и то же значение в sinf снова и снова. Придерживайтесь значений double и используйте функцию двойной точности sin или масштабируйте число до значения менее примерно 6 целых цифр перед преобразованием в число с плавающей запятой.

person Hot Licks    schedule 14.09.2011
comment
Спасибо, Даниэль, я обновил вопрос, чтобы включить ответ. - person Steve; 15.09.2011