美文网首页SpriteKit
SpriteKit 苹果官方文档翻译(Swift):1

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

作者: wilsondex | 来源:发表于2017-09-21 15:30 被阅读0次

    原文地址: 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获取更多信息。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/mrgzsxtx.html