Sprite Kit编程指南(5)-使用场景间过渡
2016-02-15 08:55
337 查看
场景是游戏的基本构建块。通常情况下,你为游戏的各部分设计自包含(self-contained)的场景,然后在必要时在这些场景之间过渡。例如,你可以创建不同的场景类表现任何或全部下列概念:
· 在其他内容加载时显示的加载场景
· 选择你要玩什么样的游戏的主菜单场景
· 用户选择的特定类型游戏的配置细节的场景
· 提供游戏的场景
· 当游戏结束时显示的场景
当你在一个已经在呈现场景的视图上呈现新的场景时,你有使用旧场景更改到新场景的过渡动画的变化的选项。使用过渡提供了一定的连续性,从而使场景变化不是那么突然。过渡的完整列表在SKTransition类参考。
通常情况下,根据游戏或用户输入过渡到一个新的场景。例如,如果用户在你的主菜单场景中按下一个按钮,你可能会过渡到一个新的场景,来配置玩家想玩的赛事。清单5-1展示了你可能在精灵中实现的事件处理程序的方式。处理程序首先在自己身上运行动画来突出按钮(这里不作说明)。然后,它创建一个过渡对象和新的场景。最后,它调用视图来呈现新的景象。过渡意味着这种变化是动画的。
清单5-1 过渡到一个新的场景
[cpp] view
plaincopy
- (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不提供内置的机制传递场景之间的数据。如果你需要在场景过渡时提供数据,你需要实现自己的机制来配置新的场景。通常情况下,这意味着在每个场景中定义你自己的自定义方法和属性,或者在自定义场景类实现的协议中这样做。
过渡对象
scene)会动起来。但也许流入场景(incoming scene)不应该它的内容动起来,直到过渡完成。添加清单5-2的代码达到预期的效果。
清单5-2 过渡期间暂停帧处理
[cpp] view
plaincopy
reveal.pausesIncomingScene = NO;
有时候你需要能够检测场景已被呈现或从视图中移除。你可以通过在你的自定义场景类上实现一个或两个以下方法这样做:
· 实现
· 实现
当一个场景没有过渡呈现时,首先移除旧的场景,然后呈现新的场景。当使用过渡时,首先加入新的场景,然后过渡发生,最后旧的场景被移除。
· 在其他内容加载时显示的加载场景
· 选择你要玩什么样的游戏的主菜单场景
· 用户选择的特定类型游戏的配置细节的场景
· 提供游戏的场景
· 当游戏结束时显示的场景
当你在一个已经在呈现场景的视图上呈现新的场景时,你有使用旧场景更改到新场景的过渡动画的变化的选项。使用过渡提供了一定的连续性,从而使场景变化不是那么突然。过渡的完整列表在SKTransition类参考。
两个场景之间的过渡
通常情况下,根据游戏或用户输入过渡到一个新的场景。例如,如果用户在你的主菜单场景中按下一个按钮,你可能会过渡到一个新的场景,来配置玩家想玩的赛事。清单5-1展示了你可能在精灵中实现的事件处理程序的方式。处理程序首先在自己身上运行动画来突出按钮(这里不作说明)。然后,它创建一个过渡对象和新的场景。最后,它调用视图来呈现新的景象。过渡意味着这种变化是动画的。清单5-1 过渡到一个新的场景
[cpp] view
plaincopy
- (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的代码达到预期的效果。
清单5-2 过渡期间暂停帧处理
[cpp] view
plaincopy
reveal.pausesIncomingScene = NO;
检测何时呈现场景
有时候你需要能够检测场景已被呈现或从视图中移除。你可以通过在你的自定义场景类上实现一个或两个以下方法这样做:· 实现
willMoveFromView方法,在场景将要从视图中移除时调用。
· 实现
didMoveToView方法,在场景刚刚由视图完成呈现时调用。
当一个场景没有过渡呈现时,首先移除旧的场景,然后呈现新的场景。当使用过渡时,首先加入新的场景,然后过渡发生,最后旧的场景被移除。
相关文章推荐
- Sprite Kit编程指南(3)-添加动作到节点
- Sprite Kit编程指南(4)-构建场景
- ruby中的双等号==问题详解
- Sprite Kit编程指南(2)-使用精灵
- Sprite Kit编程指南(1)-深入Sprite Kit
- Sprite Kit编程指南(0)-简介
- (转)classpath、path、JAVA_HOME的作用及JAVA环境变量配置
- Eclipse快捷键
- Spring AOP(配置文件方式)
- Spring AOP(注解方式)
- php 总结
- Java中使用SQL标签库<sql:setDataSource />设置数据源
- [Python for Data Analysis]Chapter3 --Ipython
- pyqt5 菜单,工具栏,线程,matplotlib
- PyQt5 结合 matplotlib 时,如何显示其 NavigationToolbar
- c语言:输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n
- c语言:判断一个整数是不是2的整数次方
- Java中运用数组的四种排序方法
- 关于解决Qt OpenGL编译/usr/bin/ld: cannot find -lGL 问题的方法
- 为什么不在spring容器管理controller