SKScene
所有SpriteKit显示内容的根视图
概述
一个SKScene代表SpriteKit的一个场景。场景是SpriteKit节点(SKNode)数中的根节点。这些节点提供场景动画和显示的内容。显示内容可以使用SKView。
创建场景
一个场景呈现一个视图。场景包括定义场景原点位置和场景大小的属性。如果场景和视图大小不一致,可以定义场景缩放方式来适应视图
定义场景大小和可视区域
当场景第一次初始化时,需要指定size。场景大小以点为单位来指定场景的可见部分的大小。但是仅用于指定场景的可见部分。节点数可以在该区域之外,但节点依然会被场景处理,只是被渲染器忽略。
使用锚点将场景的坐标系定位在视图中
默认情况下,场景的原点放置在视图的左下角,如下图所示。因此,以高度1024和宽度初始化的场景具有左下角768的起点(0,0)和(1024,768)右上角的坐标。该frame拥有(0,0)-(1024,768)。
position场景定位的一个重要属性,因为场景始终是节点树的根节点。它的默认值是0,你不能改变它。但是,您可以通过设置其anchorPoint属性来移动场景的起点。锚点在单位坐标空间中指定,并在封闭视图中选择一个点。
锚点的默认值是0,它放在左下角。场景的可视坐标空间(0,0)到(width,height)。默认锚点对于不滚动场景内容的游戏最有用。
第二最常见的锚点值是(0.5,0.5)将场景的原点中心在视图的中间,如下图所示。场景的可视坐标空间(-width/2,-height/2)到(width/2, height/2)。当您想要轻松地将节点相对于屏幕中心放置(例如在滚动游戏中)时,将场景定位在其锚点上是最有用的。然而,这种效果使用a更好地实现SKCameraNode。
总而言之,anchorPoint和size属性用于计算场景的框架,该框架保存场景的可见部分。
缩放场景的内容以适应视图
渲染场景后,将其内容复制到呈现的视图中。如果视图和场景的大小相同,则内容可以直接复制到视图中。如果两者不同,则缩放场景以适应视图。用scaleMode属性确定内容的缩放方式。
设计游戏时,您应该决定处理场景size和scaleMode属性的方式。
以下是最常见的策略:
- 以固定的大小实例化场景,永远不要改变它。选择缩放模式,让视图缩放场景的内容。这给场景一个可预测的坐标系和框架。然后,您可以将游戏内容和游戏逻辑设置在该坐标系上。
- 调整游戏中场景的大小。必要时,调整您的游戏逻辑和游戏内容,以配合场景的大小。
- 将scaleMode属性设置为resizeFill。SpriteKit会自动调整场景大小,使其始终与视图的大小相匹配。必要时,调整您的游戏逻辑和游戏内容,以配合场景的大小。
下面显示了当您计划使用固定大小的场景。该代码指定了第一次呈现场景时要执行的方法。它配置场景的属性,包括其缩放模式,然后添加内容。在此示例中,缩放模式被设置为aspectFit在两个维度上均等地缩放内容,并确保所有场景的内容都可见。必要时,此模式会增加信箱。
func createSceneContent() {
scene.scaleMode = .aspectFit
scene.backgroundColor = .black
// Add additional scene contents here.
...
}
如果您希望场景的大小在运行时更改,则应使用初始场景大小来确定要使用的内容以及取决于场景大小的任何游戏逻辑。您的游戏也应该覆盖场景的didChangeSize(_:)方法,每当场景改变大小时都会调用该方法。调用此方法时,应更新场景的内容以匹配新的大小。
场景如何处理动画框架
动画和渲染场景的过程与场景对象有关SKScene。场景和动作处理仅在场景呈现时运行。呈现的场景运行渲染循环,在处理场景的节点树和渲染之间进行交替。这个模型类似于大多数游戏中使用的渲染和处理循环。
SpriteKit只会在其中的内容发生变化时渲染场景,提高能源效率,并允许您的游戏或应用程序在后台执行其他操作。
下图显示了场景执行渲染循环的步骤。
每次通过渲染循环,场景的内容都会被更新并呈现。你不能覆盖渲染行为; 而是更新场景中的节点。但是,场景包括可以覆盖的方法来自定义场景处理,您可以使用动作和物理来更改树中节点的属性。以下是渲染循环中的步骤:
- 在update(_:)模拟中到目前为止,调用了场景的方法。这是实现自己的游戏中模拟的主要地方,包括输入处理,人工智能,游戏脚本和其他类似的游戏逻辑。通常,您可以使用此方法对节点进行更改或在节点上运行操作。
- 场景处理树中所有节点上的操作。它发现任何运行的操作,并将这些更改应用于树。在实践中,由于自定义操作,您还可以钩入操作机制来调用自己的代码。您无法直接控制处理操作的顺序或导致场景跳过某些节点上的操作,除非从这些节点中删除操作或从树中删除节点。
- didEvaluateActions()在帧的所有操作已被处理之后调用场景的方法。
- 该场景模拟树中具有物理体的节点上的物理。将物理学添加到场景中的节点进行了描述SKPhysicsBody,但模拟物理学的最终结果是可以通过物理模拟来调整树中节点的位置和旋转。当物理机构相互接触时,你的游戏也可以接收回调SKPhysicsContactDelegate。
- didSimulatePhysics()在所有的物理学框架被模拟之后,调用场景的方法。
- 场景应用与场景中的节点相关联的任何约束。限制用于在现场建立关系。例如,您可以应用一个约束,确保节点总是指向另一个节点,而不管它如何被移动。通过使用约束,您避免在场景处理中需要编写大量自定义代码。
- 场景调用它的didApplyConstraints()方法。
- 场景调用它的didFinishUpdate()方法。这是您最后一次对场景进行更改的机会。
- 场景呈现。
与场景代表合作
虽然子类化场景类是处理场景处理的常用方法,但可以通过使用委托对象来避免场景处理。上述所有场景处理方法都具有SKSceneDelegate协议中的相关方法。如果代理被提供给场景,并且委托实现了这些方法之一,则调用该方法而不是场景中的方法。例如,iOS应用程序可能会使用视图控制器作为委托。
场景后处理
场景可以以任何顺序处理场景树上的动作。因此,如果您需要运行每个框架的任务,并且需要对运行时间进行精确控制,则应使用didEvaluateActions()和didSimulatePhysics()方法来执行这些任务。通常,您需要在树中某些节点的最终计算位置的后期处理过程中进行更改。您的后期处理可以采取这些职位,并在树上执行其他有用的工作。
子类注释
通常,您的游戏会将场景分类,以提供游戏。你的子类通常是:
- 创建场景的初始内容
- 实现每次处理帧时发生的游戏逻辑
- 实现响应者方法来处理键盘,鼠标或触摸事件
对SKScene类进行子类化的另一种模式是使用实现大多数游戏逻辑的代理。例如,在iOS游戏中,您可以使您的视图控制器成为您的场景的代表。视图控制器已经参与事件处理,并且可以执行上述所有其他必要的任务。
初始化场景
init(size: CGSize)
初始化一个新的场景对象。
确定场景在视图中可见的部分
var camera: SKCameraNode?
确定场景中坐标空间的哪个部分在视图中可见的场景中的相机节点。
var anchorPoint: CGPoint
视图框架中对应于场景原点的点。
var size: CGSize
场景的尺寸分。
func didChangeSize(CGSize)
当场景的大小变化时调用。
var scaleMode: SKSceneScaleMode
定义场景如何映射到呈现它的视图。
设置场景的背景颜色
var backgroundColor: UIColor
场景的背景颜色。
视图和场景坐标之间的转换
func convertPoint(fromView: CGPoint)
将视点坐标转换为场景坐标。
func convertPoint(toView: CGPoint)
将点从场景坐标转换为查看坐标。
显示场景
func sceneDidLoad()
在场景被初始化或移除后立即被调用。
func willMove(from: SKView)
在视图中删除场景之前立即调用。
func didMove(to: SKView)
在视图显示场景后立即调用。
var view: SKView?
目前显示的视图。
执行循环动画
var delegate: SKSceneDelegate?
在动画循环期间被调用的协议。
func update(TimeInterval)
执行场景动作之前需要进行的场景特定更新。
func didEvaluateActions()
执行场景动作后需要进行的场景特定更新。
func didSimulatePhysics()
执行在进行物理模拟之后需要发生的任何特定于场景的更新。
func didApplyConstraints()
执行在应用约束之后需要发生的任何场景特定的更新。
func didFinishUpdate()
在场景完成处理动画所需的所有步骤后调用。
在场景中使用相关的物理模拟
var physicsWorld: SKPhysicsWorld
与场景相关的物理模拟。
场景中使用音频
向SpriteKit场景添加音频的最简单的方法是向其添加一个SKAudioNode:
let audio = SKAudioNode(fileNamed: "drums.mp3")
spriteKitViewController.scene.addChild(audio)
然而,通过定义场景listener,您的场景将受益于立体声音频。
var audioEngine: AVAudioEngine
AV Foundation音频引擎用于播放场景中包含的音频节点的音频。
var listener: SKNode?
用于确定侦听器在场景中的位置音频的位置的节点。
常量
SKSceneScaleMode
确定场景区域如何映射到显示它的视图的模式。