SpriteKit-SKScene(中文API)

SKScene

所有SpriteKit显示内容的根视图

概述

一个SKScene代表SpriteKit的一个场景。场景是SpriteKit节点(SKNode)数中的根节点。这些节点提供场景动画和显示的内容。显示内容可以使用SKView。

创建场景

一个场景呈现一个视图。场景包括定义场景原点位置和场景大小的属性。如果场景和视图大小不一致,可以定义场景缩放方式来适应视图

定义场景大小和可视区域

当场景第一次初始化时,需要指定size。场景大小以点为单位来指定场景的可见部分的大小。但是仅用于指定场景的可见部分。节点数可以在该区域之外,但节点依然会被场景处理,只是被渲染器忽略。

使用锚点将场景的坐标系定位在视图中

默认情况下,场景的原点放置在视图的左下角,如下图所示。因此,以高度1024和宽度初始化的场景具有左下角768的起点(0,0)和(1024,768)右上角的坐标。该frame拥有(0,0)-(1024,768)。
position场景定位的一个重要属性,因为场景始终是节点树的根节点。它的默认值是0,你不能改变它。但是,您可以通过设置其anchor​Point属性来移动场景的起点。锚点在单位坐标空间中指定,并在封闭视图中选择一个点。

锚点的默认值是0,它放在左下角。场景的可视坐标空间(0,0)到(width,height)。默认锚点对于不滚动场景内容的游戏最有用。
第二最常见的锚点值是(0.5,0.5)将场景的原点中心在视图的中间,如下图所示。场景的可视坐标空间(-width/2,-height/2)到(width/2, height/2)。当您想要轻松地将节点相对于屏幕中心放置(例如在滚动游戏中)时,将场景定位在其锚点上是最有用的。然而,这种效果使用a更好地实现SKCamera​Node。

总而言之,anchorPoint和size属性用于计算场景的框架,该框架保存场景的可见部分。

缩放场景的内容以适应视图

渲染场景后,将其内容复制到呈现的视图中。如果视图和场景的大小相同,则内容可以直接复制到视图中。如果两者不同,则缩放场景以适应视图。用scale​Mode属性确定内容的缩放方式。
设计游戏时,您应该决定处理场景size和scale​Mode属性的方式。
以下是最常见的策略:

  • 以固定的大小实例化场景,永远不要改变它。选择缩放模式,让视图缩放场景的内容。这给场景一个可预测的坐标系和框架。然后,您可以将游戏内容和游戏逻辑设置在该坐标系上。
  • 调整游戏中场景的大小。必要时,调整您的游戏逻辑和游戏内容,以配合场景的大小。
  • 将scale​Mode属性设置为resize​Fill。SpriteKit会自动调整场景大小,使其始终与视图的大小相匹配。必要时,调整您的游戏逻辑和游戏内容,以配合场景的大小。
    下面显示了当您计划使用固定大小的场景。该代码指定了第一次呈现场景时要执行的方法。它配置场景的属性,包括其缩放模式,然后添加内容。在此示例中,缩放模式被设置为aspect​Fit在两个维度上均等地缩放内容,并确保所有场景的内容都可见。必要时,此模式会增加信箱。
func createSceneContent() {
    scene.scaleMode = .aspectFit
    scene.backgroundColor = .black
    // Add additional scene contents here.  
    ...
}

如果您希望场景的大小在运行时更改,则应使用初始场景大小来确定要使用的内容以及取决于场景大小的任何游戏逻辑。您的游戏也应该覆盖场景的did​Change​Size(_:​)方法,每当场景改变大小时都会调用该方法。调用此方法时,应更新场景的内容以匹配新的大小。

场景如何处理动画框架

动画和渲染场景的过程与场景对象有关SKScene。场景和动作处理仅在场景呈现时运行。呈现的场景运行渲染循环,在处理场景的节点树和渲染之间进行交替。这个模型类似于大多数游戏中使用的渲染和处理循环。
SpriteKit只会在其中的内容发生变化时渲染场景,提高能源效率,并允许您的游戏或应用程序在后台执行其他操作。
下图显示了场景执行渲染循环的步骤。

每次通过渲染循环,场景的内容都会被更新并呈现。你不能覆盖渲染行为; 而是更新场景中的节点。但是,场景包括可以覆盖的方法来自定义场景处理,您可以使用动作和物理来更改树中节点的属性。以下是渲染循环中的步骤:

  1. 在update(_:​)模拟中到目前为止,调用了场景的方法。这是实现自己的游戏中模拟的主要地方,包括输入处理,人工智能,游戏脚本和其他类似的游戏逻辑。通常,您可以使用此方法对节点进行更改或在节点上运行操作。
  2. 场景处理树中所有节点上的操作。它发现任何运行的操作,并将这些更改应用于树。在实践中,由于自定义操作,您还可以钩入操作机制来调用自己的代码。您无法直接控制处理操作的顺序或导致场景跳过某些节点上的操作,除非从这些节点中删除操作或从树中删除节点。
  3. did​Evaluate​Actions()在帧的所有操作已被处理之后调用场景的方法。
  4. 该场景模拟树中具有物理体的节点上的物理。将物理学添加到场景中的节点进行了描述SKPhysics​Body,但模拟物理学的最终结果是可以通过物理模拟来调整树中节点的位置和旋转。当物理机构相互接触时,你的游戏也可以接收回调SKPhysics​Contact​Delegate。
  5. did​Simulate​Physics()在所有的物理学框架被模拟之后,调用场景的方法。
  6. 场景应用与场景中的节点相关联的任何约束。限制用于在现场建立关系。例如,您可以应用一个约束,确保节点总是指向另一个节点,而不管它如何被移动。通过使用约束,您避免在场景处理中需要编写大量自定义代码。
  7. 场景调用它的did​Apply​Constraints()方法。
  8. 场景调用它的did​Finish​Update()方法。这是您最后一次对场景进行更改的机会。
  9. 场景呈现。

与场景代表合作

虽然子类化场景类是处理场景处理的常用方法,但可以通过使用委托对象来避免场景处理。上述所有场景处理方法都具有SKScene​Delegate协议中的相关方法。如果代理被提供给场景,并且委托实现了这些方法之一,则调用该方法而不是场景中的方法。例如,iOS应用程序可能会使用视图控制器作为委托。

场景后处理

场景可以以任何顺序处理场景树上的动作。因此,如果您需要运行每个框架的任务,并且需要对运行时间进行精确控制,则应使用did​Evaluate​Actions()和did​Simulate​Physics()方法来执行这些任务。通常,您需要在树中某些节点的最终计算位置的后期处理过程中进行更改。您的后期处理可以采取这些职位,并在树上执行其他有用的工作。

子类注释

通常,您的游戏会将场景分类,以提供游戏。你的子类通常是:

  • 创建场景的初始内容
  • 实现每次处理帧时发生的游戏逻辑
  • 实现响应者方法来处理键盘,鼠标或触摸事件
    对SKScene类进行子类化的另一种模式是使用实现大多数游戏逻辑的代理。例如,在iOS游戏中,您可以使您的视图控制器成为您的场景的代表。视图控制器已经参与事件处理,并且可以执行上述所有其他必要的任务。

初始化场景

init(size:​ CGSize)
初始化一个新的场景对象。

确定场景在视图中可见的部分

var camera:​ SKCamera​Node?
确定场景中坐标空间的哪个部分在视图中可见的场景中的相机节点。
var anchor​Point:​ CGPoint
视图框架中对应于场景原点的点。
var size:​ CGSize
场景的尺寸分。
func did​Change​Size(CGSize)
当场景的大小变化时调用。
var scale​Mode:​ SKScene​Scale​Mode
定义场景如何映射到呈现它的视图。

设置场景的背景颜色

var background​Color:​ UIColor
场景的背景颜色。

视图和场景坐标之间的转换

func convert​Point(from​View:​ CGPoint)
将视点坐标转换为场景坐标。
func convert​Point(to​View:​ CGPoint)
将点从场景坐标转换为查看坐标。

显示场景

func scene​Did​Load()
在场景被初始化或移除后立即被调用。
func will​Move(from:​ SKView)
在视图中删除场景之前立即调用。
func did​Move(to:​ SKView)
在视图显示场景后立即调用。
var view:​ SKView?
目前显示的视图。

执行循环动画

var delegate:​ SKScene​Delegate?
在动画循环期间被调用的协议。
func update(Time​Interval)
执行场景动作之前需要进行的场景特定更新。
func did​Evaluate​Actions()
执行场景动作后需要进行的场景特定更新。
func did​Simulate​Physics()
执行在进行物理模拟之后需要发生的任何特定于场景的更新。
func did​Apply​Constraints()
执行在应用约束之后需要发生的任何场景特定的更新。
func did​Finish​Update()
在场景完成处理动画所需的所有步骤后调用。

在场景中使用相关的物理模拟

var physics​World:​ SKPhysics​World
与场景相关的物理模拟。

场景中使用音频

向SpriteKit场景添加音频的最简单的方法是向其添加一个SKAudio​Node:

let audio = SKAudioNode(fileNamed: "drums.mp3")

spriteKitViewController.scene.addChild(audio)

然而,通过定义场景listener,您的场景将受益于立体声音频。
var audio​Engine:​ AVAudio​Engine
AV Foundation音频引擎用于播放场景中包含的音频节点的音频。
var listener:​ SKNode?
用于确定侦听器在场景中的位置音频的位置的节点。

常量

SKScene​Scale​Mode
确定场景区域如何映射到显示它的视图的模式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容