假设我正在从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];
但是如果可能的话,我真的想避免这种情况。似乎应该有一个委托行动或通知,或某事知道过渡何时结束,对吧?
答案 0 :(得分:11)
答案就是盯着我。如上所述,在转换中,两个场景都需要在整个动画中出现。因此,在转换开始时立即调用传入场景的didMoveToView:
而不是我预期的结束。
当然,通过相同的逻辑,传出场景的willMoveFromView:
将不会被调用,直到转换结束。这就是我首先要寻找的。 p>
因此,您可以覆盖传出场景的-willMoveFromView:
(或者更可能是某些共享超类),以便在转换完成时发送通知或调用委托或任何您喜欢的内容。在我的情况下,我让它调用一个块,这样我就可以保留我的-swapScenes
方法的所有内容,但是YMMV。
答案 1 :(得分:3)
延迟后执行选择器,延迟时间相同,因为转换非常合理。
答案 2 :(得分:1)
这是一种常见的需求,并且(理想情况下)我们不应该围绕这些工具进行编程。 @jlemmons和@ LearnCocos2D提供的两种解决方法都是可用的,但每种都有它们的后备。
我强烈建议您去Apple Bug Reporter并要求添加
- (void)[SKScene didFinishTransitionToView:(SKView *)view]
人们请求越多,可能越早出现。