SpriteKit 苹果官方文档翻译(Swift):1

原文地址: https://developer.apple.com/documentation/spritekit

框架: SpriteKit

通过一个绝佳的动画系统、物理模拟、事件处理方案来创建基于“精灵”设计的2D游戏。

SDKs:

iOS7.0+

macOS 10.9+

tvOS 9.0+

watchOS 3.0+


概览

SpriteKit是一个可以让你创建任意多的有动画效果的纹理图片(一般称为“精灵”)的图像渲染及动画制作框架。(注:此处“精灵”英文为Sprite,直译为精灵,大多教程会使用此翻译,但是为了避免理解混乱,下文不对这个词进行翻译而直接用英文,就像我不会将SpriteKit翻译成精灵工具箱一样,读者只需要知道Sprite是包括cocos2d在内的游戏开发引擎中对纹理图片的称呼,暂且理解为游戏中能看到的一个对象)SpriteKit提供一个传统的渲染循环,可以交替地进行显示内容的计算和帧的渲染。你来设计每帧的内容以及内容的变化,然后SpriteKit通过相应的硬件(graphics hardware)将其高效地渲染出来,SpriteKit能最优地处理各种动画效果以及计算内容的变化,这让SpriteKit十分适合进行游戏开发以及需要灵活处理动画效果的APP。

Sprite的内容是由其所在的场景的SpriteView绘制的

动画以及渲染效果都是由SKView对象负责的,你将一个view添加到window中,然后在view中渲染内容,因为这是一个view,其内容可以与不同层次的其他view结合。

游戏中的不同内容是通过场景(scene)组织起来的,程序中场景用到的是SKScene对象。一个场景包含很多sprite以及其他需要渲染的内容,而且场景还实现每一帧的逻辑以及内容的处理。在任何时刻只有一个场景能展示出来,一旦跳转到某个场景,其所实现的动画及帧逻辑也会自动执行。

用SpriteKit来创建游戏或者APP,你需要创建类继承自SKScene,或者创建场景代理(scene delegate)来处理主要的和游戏相关的业务逻辑。例如,你可以分别创建不同的场景来展示游戏主菜单、游戏场景、游戏结束画面等。你可以简单地在窗口中只用一个SKView来跳转到不同场景。在场景跳转时,你可以用SKTransition类来做一些动画效果。

场景中展示什么是由节点树(Node Tree)决定

SKScene类是SKNode类的子类,在SpriteKit中,node(节点,下不翻译)是所有展示内容的最基本的结构单元,而场景对象就是整个节点树的根节点(root node)。场景以及其子节点决定了什么内容要被绘制出来以及如何渲染这些内容。

每个node的位置是由其所在的父控件的坐标系统决定的。一个node也能对其内容以及其子node的属性进行设置。例如,当一个node旋转时,其所有子node也会旋转。你可以通过节点树创建复杂的图像效果,然后只调整最顶层的node的属性来对整个图像进行旋转(rotate)、缩放(scale)和混合(blend)。

SKNode这个类不会绘制任何东西,但会将其属性传递给子node。不同的内容绘制是由SpriteKit中的不同子类呈现的。其他的一些node子类不会对其自身的内容进行绘制,但会修改子node的表现行为,例如,你可以使用SKEffectNode对象将一个核心图像滤镜(Core Image filter)应用到场景中的整个子节点树。你可以通过精确地控制节点树的结构来决定不同node的渲染顺序。

所有的node对象都实现了UIResponder或者NSResponder,可以对事件进行响应,所以你可以创建继承自原有node类的新类来处理用户的输入事件。view会自动扩展“响应者链”(responder chain)来包含场景中的整个节点树。

你可以通过查看SKNode获取更多信息。

Textures(纹理)用于保存需要重用的绘画数据

Texture(不翻译)由SKTexture对象创建,用于使用同一图片渲染不同sprites。当你需要在不同sprite中使用同一图片时应该要用texture。一般情况下通过加载bundle中储存的图片文件来创建texture。但是,SpriteKit也可以在运行时通过其他资源创建texture,包括核心绘画图片(Core Graphics images)或者甚至将整个节点树渲染到texture中。

SpriteKit中通过少量代码即可加载texture并让绘制硬件(graphics hardware)可以对其进行处理,从而简化了texture的管理。texture是由SpriteKit自动管理的,但是如果你的游戏使用了大量的图片,你可以手动接管部分的控制工作来提升游戏的性能,这主要通过明确告诉SpriteKit去加载一个texture。

一个texture集(texture atlas)代表一组被一起用到游戏中的相关texture。例如,你可以使用texture集来保存一个角色的动画所用到的所有texture,或者游戏背景所有需要渲染的标题。SpriteKit通过texture集来提升渲染性能。

你可以通过查看SKTexture和SKTextureAtlas获取更多信息。

Node通过执行Action(动作)来让内容动起来

场景中的内容是通过action(不翻译)实现动态效果的。每一个action都是一个SKAction对象。你通知node去执行action,然后当场景处理帧动画时这些action就会执行。有些action会在一个帧动画中就完成,而有些则持续好些帧才完成。action最常用的用法是以动画方式改变node的属性。例如,你可以创建action来移动、缩放、旋转node,或者改变其透明度。然而,action也能改变节点树、播放音效甚至可以执行指定的代码。

Action很有用,你也可以组合不同action来实现复杂的效果。你可以创建一组action来同时执行,或者顺序执行。你也可以让action自动循环执行。

Scene也可以实现自定义的每帧处理,你可以重写scene的子类的方法来增加更多的游戏运算工作(game task)。例如,如果一个node需要每帧移动,你可以在每帧中直接调节它的属性,而不用action来实现。

你可以通过查看SKAction获取更多信息。

添加Physics Bodies(物理实体)并加入到场景中的虚拟物理中

虽然你可以准确控制场景中每一个node的位置,但你还想这些node之间有相互作用、互相碰撞,并知道此过程中的速率变化。你可能也想做一些action系统以外的事情,如模拟重力或者其他原力(force, 愿原力与你同在 :) ),那么你可以创建物理实体(SKPhysicsBody)并附加到场景中的node上。每个物理实体由形状(shape)、大小(size)、质量(mass)和其他物理特性构成。场景本身有一个SKPhysicsWorld对象来定义全局的模拟物理特性,你通过这个physics world(物理世界)来定义模拟的重力和速度。

一旦场景中包含了物理实体,场景就会对这些物理实体进行物理模拟。一些力会自动生效,如摩檫力、重力。其他力可以通过往场景中添加SKFieldNode对象来自动生效。你也可以通过直接修改指定实体的速度或者给指定实体添加力或脉冲来对其产生影响。每个物理实体的加速度和速度都会被计算并互相碰撞。模拟运算完成后相应的node的位置和旋转就会得到更新。

你可以精确控制不同实体键的物理作用效果。例如,你可以指定某个物理力场(physics field)node仅对场景中的某一部分物理实体生效。你也可以指定那些物理实体可以与其他实体碰撞并且单独指定某些交互效果能触发某些代码。你可以通过回调的方式添加游戏逻辑。例如,当游戏中一个node的物理实体被另一个实体撞击时,你可以将其销毁。

你也可以在物理世界中寻找一些场景中的物理实体并通过一个j接合点(joint)(SKPhysicsJoint)将它们连接起来。被连接起来的实体会根据接合点的类型被一起模拟运算。

你可以通过查看Simulating Physics获取更多信息。

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

推荐阅读更多精彩内容