我很高兴使用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
答案 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:
方法无法被调用。