Через self.timescore
, inctime:
вызывается 10 раз в секунду.Каждый раз он увеличивает временную переменную на 0,1 секунды.Таким образом, переменная времени - это время в секундах с начала таймера, округленное с точностью до 0,1 секунды.Например, вы получили бы то же самое, если бы сделали:
... elsewhere ...
@property (nonatomic, assign) NSTimeInterval startTime;
- (void)initializeTime
{
self.startTime = [NSDate timeIntervalSinceReferenceDate];
}
- (void)move:(NSTimer *)theTimer
{
NSTimeInterval timeSinceInitializeTimeWasCalled =
[NSDate timeIntervalSinceReferenceData] - self.startTime;
// round down the nearest multiple of 0.1 if necessary, e.g.
timeSinceInitializeTimeWasCalled -=
fmod(timeSinceInitializeTimeWasCalled, 0.1);
}
Эта строка:
CGFloat moduloResult = (float)((int)time % (int)5);
Вызывается в методе, который, как вы заявляете, вызывается 30 раз в секунду.Учитывая, что оно положительное, (int) время округляет «время» до ближайшего целого числа.Таким образом, moduloResult будет равен «0» 30 раз - в период между вводом пятой секунды и выходом из нее снова.Что вы, вероятно, хотите, как намекнуло в коде, который я выложил выше, это:
CGFloat moduloResult = fmod(time, 5.0);
И даже тогда вы не хотите сравнивать результат напрямую с 0, потому что числа с плавающей запятой имеют тенденцию округлятьсяспособы, чтобы быть не точными.Если вы вызываете этот метод 30 раз в секунду, я вместо этого рекомендую:
CGFloat moduloResult = fmod(time + 1.0 / 60, 5.0);
if(moduloResult < 1.0 / 30.0)
{
}
Итак, вы проверяете, находится ли время в пределах 1/30 секунды, когда время мод 5 равно нулю.