当presentScene:transition:完成后,如何通知传入的场景?

时间:2013-11-24 22:05:23

标签: core-animation sprite-kit

假设我正在从SKScene的{​​{1}}过渡到新的SKView

//In some controller somewhere...
-(void)swapScenes{
  MySceneSubclass *newScene = [[MySceneSubclass alloc] initWithSize:CGSizeMake(1024, 768)];
  SKTransition *transition = [SKTransition crossFadeWithDuration:REALLY_LONG_DURATION];
  [[self mySKView] presentScene:newScene transition:transition];
}

让我们另外说我希望我的新场景在转换完成后执行一些动作或动画,但不是之前。我会用什么来触发它?

起初我以为我能够覆盖didMoveToView:这样做,但事实证明这是在过渡的开始时调用的(事后看来,这是有道理的。在交叉淡入淡出中,传入的场景在动画的最开始合成,即使其不透明度非常低。)

接下来,作为冰雹玛丽,我尝试在presentScene之后立即拨打新场景:

-(void)swapScenes{
  MySceneSubclass *newScene = [[MySceneSubclass alloc] initWithSize:CGSizeMake(1024, 768)];
  SKTransition *transition = [SKTransition crossFadeWithDuration:REALLY_LONG_DURATION];
  [[self mySKView] presentScene:newScene transition:transition];
  [newScene doSomethingAfterTransition]; //<----
}

presentScene:可预测地立即返回,导致在转换完成之前很久就调用此方法。

作为最后的手段,我正在考虑这样的事情:

[newScene performSelector:@selector(doSomethingAfterTransition) afterDelay:REALLY_LONG_DURATION];

但是如果可能的话,我真的想避免这种情况。似乎应该有一个委托行动或通知,或某事知道过渡何时结束,对吧?

3 个答案:

答案 0 :(得分:11)

答案就是盯着我。如上所述,在转换中,两个场景都需要在整个动画中出现。因此,在转换开始时立即调用传入场景的didMoveToView:而不是我预期的结束。

当然,通过相同的逻辑,传出场景的willMoveFromView:将不会被调用,直到转换结束。这就是我首先要寻找的。

因此,您可以覆盖传出场景的-willMoveFromView:(或者更可能是某些共享超类),以便在转换完成时发送通知或调用委托或任何您喜欢的内容。在我的情况下,我让它调用一个块,这样我就可以保留我的-swapScenes方法的所有内容,但是YMMV。

答案 1 :(得分:3)

延迟后执行选择器,延迟时间相同,因为转换非常合理。

答案 2 :(得分:1)

这是一种常见的需求,并且(理想情况下)我们不应该围绕这些工具进行编程。 @jlemmons和@ LearnCocos2D提供的两种解决方法都是可用的,但每种都有它们的后备。

我强烈建议您去Apple Bug Reporter并要求添加

- (void)[SKScene didFinishTransitionToView:(SKView *)view]

人们请求越多,可能越早出现。

相关问题