从背景返回时基于时间的精灵运动

时间:2014-06-29 19:28:38

标签: objective-c sprite-kit

我很高兴使用SpriteKit。我有一个我想要开发的游戏的实例。我有一些基于时间的精灵运动,我的意思是:

SKSpriteNode * track = (SKSpriteNode *) node;
CGPoint trackVelocity = CGPointMake(0, -objectVelocity);
CGPoint amtToMove = CGPointMultiplyScalar(trackVelocity,_dt);     
track.position = CGPointAdd(track.position, amtToMove);

其中“_dt”是:

-(void)update:(CFTimeInterval)currentTime {
    if (_lastUpdateTime)
    {
        _dt = currentTime - _lastUpdateTime;
    }
    else
    {
        _dt = 0;
    }
    _lastUpdateTime = currentTime;
}

我遇到的问题是,当用户转到后台并且很久以后回到应用程序_dt是巨大的,所以用_dt变量移动的所有精灵都从屏幕上消失了,永远不会来返回...我找不到将此_dt设置为正确值的方法。

我怎样才能做到这一点?

非常感谢!!

我已经在AppDelegate中添加了以下内容:

- (void)applicationWillResignActive:(UIApplication *)application
{
    SKView *view = (SKView *)self.window.rootViewController.view;
    view.paused = YES;   
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
   SKView *view = (SKView *)self.window.rootViewController.view;
   view.paused = NO;
}

它暂停了游戏,但更新中设置的_dt仍然被更改为一个巨大的数字,我的所有精灵都不在屏幕上。

以下是进入后台并返回时的输出:         NSLog(@“%f%f”,_ lastUpdateTime,_dt);

2014-06-30 08:34:00.988 TestingSpriteKit[26303:60b] 224490.130906 0.033162
2014-06-30 08:34:19.761 TestingSpriteKit[26303:60b] 224508.904119 18.773212
2014-06-30 08:34:19.804 TestingSpriteKit[26303:60b] 224508.947477 0.043359

3 个答案:

答案 0 :(得分:1)

如果没有太多选项,听起来你需要设置一个BOOL并根据它来管理你的_dt。

所以在applicationWillResignActive:(UIApplication *)application中将场景中的bool属性设置为:

theMainScene.appWentIntoBackground = YES;

然后在更新方法的开头,根据bool管理您的时间间隔。我不知道你是想要一个默认金额,还是只是为了跳过整个差距等等,但这样的事情可能是:

if (_appWentIntoBackground == YES) {
    _appWentIntoBackground = NO;
    _lastTime = _currentTime;
}

答案 1 :(得分:1)

您可以在更新方法中设置最大_dt值,例如

if _dt > 1 {
   _dt = 1.0 / 60.0
} 

这是您将在Apple的Adventure demo app中看到的逻辑。寻找kMinTimeInterval,了解他们是如何做到的。

我认为这是一个明智的解决方案,因为除了从后台回来之外,还有其他方案会导致大的增量时间。

答案 2 :(得分:0)

当应用转到后台时,您应暂停SKScene及其SKView

暂停SKView时,update:方法无法被调用。