2014-12-30 1 views
2

Я пытаюсь сохранить ритм между кранами. Тем не менее, я беспорядочно получаю огромные ценности, и я не уверен, почему.iOS время между метками

@implementation GameScene 
{ 
    CFTimeInterval previousFrameTime; 
    SKLabelNode* myLabel; 
} 

-(void)didMoveToView:(SKView *)view { 
    previousTimeFrame = 0.0f; 
    myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"]; 

    myLabel.text = @" "; 
    myLabel.fontSize = 12; 
    myLabel.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 
[self addChild:myLabel]; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    myLabel.text = [NSSTring stringWithFormat: @"%f", previousFrameTime]; 
} 

//Called every frame 
-(void)update:(CFTimeInterval)currentTime { 
    //get the time between frames 
    previousFrameTime = CACurrentMediaTime() - previousFrameTime; 
} 

Выход: 0,65323 0,93527 1,65326 5866,42930 < - ???? 2.52442 5.23156 5888.21345 < - ?????

Что может вызывать эти случайные прыжки?

+0

Вот ответ, который показывает расчет средней скорости отвода - это может дать вам некоторую помощь http://stackoverflow.com/questions/26666972/how-can-i-calculate-the-instantaneous-or-close-to-taps- per-second-like-cookie/26667164 # 26667164 – Paulw11

ответ

5

Эта линия выглядит сломанным мне:

previousFrameTime = CACurrentMediaTime() - previousFrameTime;

Давайте посмотрим, как это будет работать, если вы нажали каждый второй, точно:

1.) previousFrameTime = 1000 - 0; (1000) 
2.) previousFrameTime = 1001 - 1000; (1) 
3.) previousFrameTime = 1002 - 1; (1001) 
4.) previousFrameTime = 1003 - 1001; (2) 
+0

Мне нравится этот ответ. Научите человека, как ловить рыбу ... –

1

Расчет времени дельта является правильным, но вы должны затем записать последнее измеренное время, а не последний расчетный интервал, поэтому ...

CFTimeInterval currentMediaTime = CACurrentMediaTime(); 
CFTimeInterval currentInterval = currentMediaTime - previousFrameTime; 

// use currentInterval however you were using previousFrameTime, but now the 
// previous time should be recorded as the current time 

previousFrameTime = currentMediaTime;