使用场景间过渡
场景是游戏的基本构建块。通常情况下,你为游戏的各部分设计自包含(self-contained)的场景,然后在必要时在这些场景之间过渡。例如,你可以创建不同的场景类表现任何或全部下列概念:
· 在其他内容加载时显示的加载场景
· 选择你要玩什么样的游戏的主菜单场景
· 用户选择的特定类型游戏的配置细节的场景
· 提供游戏的场景
· 当游戏结束时显示的场景
当你在一个已经在呈现场景的视图上呈现新的场景时,你有使用旧场景更改到新场景的过渡动画的变化的选项。使用过渡提供了一定的连续性,从而使场景变化不是那么突然。过渡的完整列表在SKTransition类参考。
两个场景之间的过渡
通常情况下,根据游戏或用户输入过渡到一个新的场景。例如,如果用户在你的主菜单场景中按下一个按钮,你可能会过渡到一个新的场景,来配置玩家想玩的赛事。清单5-1展示了你可能在精灵中实现的事件处理程序的方式。处理程序首先在自己身上运行动画来突出按钮(这里不作说明)。然后,它创建一个过渡对象和新的场景。最后,它调用视图来呈现新的景象。过渡意味着这种变化是动画的。
- (void)mouseUp:(NSEvent *)theEvent
{
[self runAction:self.buttonPressAnimation];
SKTransition *reveal= [SKTransition revealWithDirection:SKTransitionDirectionDown duration:1.0];
GameConfigScene *newScene = [[GameConfigScene alloc] initWithSize:CGSizeMake(1024,768)];
/ /可选,插入代码来配置新的场景。
[self.scene.view presentScene:newScene transition:reveal];
}
过渡发生时,scene属性值可能立即更新为指向新的场景。然后,发生动画。最后,移除对旧场景的强引用。如果你需要在过渡发生后保持场景,你的应用需要保持自身对旧场景的强引用。
组织你的游戏时,创建一个这样的图表是相当有帮助的:它展示了在游戏中的所有场景、场景之间发生的过渡,以及过渡发生时必须传递给新场景的数据。不像在iOS中的视图控制器,Sprite Kit不提供内置的机制传递场景之间的数据。如果你需要在场景过渡时提供数据,你需要实现自己的机制来配置新的场景。通常情况下,这意味着在每个场景中定义你自己的自定义方法和属性,或者在自定义场景类实现的协议中这样做。
配置过渡期间是否播放动画
过渡对象pausesIncomingScene
和pausesOutgoingScene
属性允许你定义动画是否在过渡期间播放。默认情况下,两个场景的动画在过渡期间相继处理。但是,你可能要暂停一个或两个场景,直到过渡完成。例如,重新考虑代码清单5-1。因为按钮将运行一个动作,这个代码期望流出场景(outgoing scene)会动起来。但也许流入场景(incoming scene)不应该它的内容动起来,直到过渡完成。添加清单5-2的代码达到预期的效果。
reveal.pausesIncomingScene = NO;
检测何时呈现场景
有时候你需要能够检测场景已被呈现或从视图中移除。你可以通过在你的自定义场景类上实现一个或两个以下方法这样做:
· 实现willMoveFromView
方法,在场景将要从视图中移除时调用。
· 实现didMoveToView
方法,在场景刚刚由视图完成呈现时调用。
当一个场景没有过渡呈现时,首先移除旧的场景,然后呈现新的场景。当使用过渡时,首先加入新的场景,然后过渡发生,最后旧的场景被移除。