我想基于当前时间以秒为单位计算一个振荡偏移值,这样任何对象都可以调用此方法,并返回一个与同一方法调用的任何其他对象同步的偏移量。
这是我对locationOffset属性的设置器:
- (float)locationOffset
{
float currentTime = [[NSDate date] timeIntervalSince1970];
locationOffset = sinf(currentTime);
CCLOG(@"--- current time = %1.9f, location offset = %1.1f", currentTime, locationOffset);
return locationOffset;
}
我称之为60Hz,输出如下:
--- current time = 1316013568.000000000, location offset = -0.1
......它保持这种状态。十进制后的所有内容都应该为零吗?
我希望我可以通过缩放currentTime来调整频率,通过缩放offsett来调整“波长”,但我只需要让我的正弦位置OffOffset根据时间来回摆动。
似乎位置偏移应该每2秒从-1循环到1。
编辑:添加现在正常工作的方法。
- (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;
}
它每隔pi秒循环一次,其幅度为+/- 12。
答案 0 :(得分:1)
是的,您的问题是float
值只有大约7位有效数字。您甚至没有足够的精度来正确表达整数值1316013568,因此您可以有效地将相同的值反复输入sinf
。坚持使用double
值,并使用双精度sin
函数,或在转换为float之前将数字缩放为小于约6个整数位的值。