iOS SpriteKit 游戏

2018-08-31  本文已影响0人  转身是天涯

        SpriteKit是一个图形渲染和动画基础设施,你可以使用它来动画化任 意纹理图像,也称为精灵。 SpriteKit提供了一个传统的渲染循环,可以在确定内容和渲染帧之间进行交替。

        你可以确定框架内容以及如何更改这些内容。 SpriteKit使用图形硬件以有效地渲染该框架。 SpriteKit还针对内容进行任意动画或变更进行了优化。 该设计使SpriteKit更适合需要灵活处理动画的游戏和应用程序。

        SpriteKit 还提供了其他对游戏非常有用的功能,包括基本的声音播放支持和物理模拟。

        SpriteKit 在iOS 和iOS X可用,它使用主机设备提供的图像硬件,以高帧数复合2D图像。Sprite Kit 支持多种不同的内容,包括:

• 无纹理或者有纹理的矩形(精灵)

• 文本

• 任意集于CGPath的形状

• 视频

        SpriteKit 还提供了裁剪和其他特效的支持,允许你对全部或者部分内容应用这些效果。你可以在每一帧活动(animate)或者改变这些元素,你也可以附加物理主体到这些元素,使得他们正确的支持碰撞检测。

以下是sprikit的3个基本概念 

•Scenes

        游戏中的内容被组织成由SKScene对象表示的Scenes 。 Scenes容纳 精灵和其他要呈现的内容。 Scenes还实现了每帧逻辑和内容处理。 在任何给定的时间,视图呈现一个Scenes 。只要呈现Scenes ,它的动画和每帧逻辑就会自动执行。

• Nodes

        SKNode类是大多数SpriteKit内容的基本构建块。 使用预定义的SKNode子类绘制基于SpriteKit的游戏中的所有视觉元素。

        每个节点的位置在由其父节点定义的坐标系中指定。节点还对其内容及其后代的内容应用其他属性。例如,当一个节点被旋转时,它的所有后代也被旋转。你可以使用树节点构建复杂的图像,然后通过调整最上面的节点的属性来旋转,缩放和混合整个图像。

        SKNode类不绘制任何东西,但它将其属性应用于其后代。每种可绘制的内容由SpriteKit中的一个不同的子类表示。一些其他节点子类不会绘制 自己的内容,而是修改其后代的行为。

• Actions

        动作是自包含的对象。每一个动作是一个不透明的(opaque)对象, 描述你想对场景做的改变。一切动作都是由SKAction类实现,它没有可见的子类。

        当场景处理动画帧时,执行Action。一些Action在一帧动画中完成, 而有些Action在完成之前会对多个动画帧进行更改。Action最常见的 用法是更改节点的属性。例如,Action可以创建、移动节点,缩放或 旋转节点或使其变得透明。Action也可以改变节点树,播放声音,甚至执行自定义代码。

使用精灵

        创建一个纹理精灵的最简单方法是让Sprite Kit 为你创建纹理和精灵。可以把插 图存储在bundle中,然后在运行时加载

        //从存储在bundle中的图像创建一个纹理的精灵

        let spaceship = SKSpriteNode(imageNamed:”rocket”) 

        spaceship.position = CGPointMake(100,100) 

        self.addChild(spaceship)

当你使用这种方式时,你可以获得很多默认行为:

• 精灵以匹配纹理尺寸的框架(frame)来创建.

• 精灵以它的位置为中心来渲染。精灵的frame属性指定的矩形定义了它所涵盖的面积 .

• 精灵纹理在帧缓冲区(framebuffer)中是半透明的(alpha-blended). 

• 一个SKTexture对象被创建并附加到精灵上.

调整精灵尺寸,可有3个属性决定:

• 精灵的size属性。

• 基准尺寸。根据精灵从SKNode类继承来的xScale 与yScale属性进 行缩放。

• 当精灵的框架大于它的纹理时,纹理被拉伸以覆盖框架。 

对精灵着色

• 可以使用color和colorBlendFactor属性对它着色。 

• 可以使用动作让颜色和颜色混合因素称为动画。

使用纹理对象:纹理对象时可应用于精灵的可复用的图像。

• 我们可以使用SKTexture对象完成纹理对象的使用。

let bottomLeftTexture = SKTexture(rect: CGRectMake(0.0,0.0,0.5,0.5),inTexture:cornerTextures)

• 使用创建对象独立于创造精灵。然后使用纹理对象来创建新的精灵或者改变现有精灵的纹理。他和Sprite Kit为你创建纹理相似,但是你能对过程拥有更多的控制权。

let pulsedRed = SKAction.sequence([SKAction.colorizeWithColor(SKColor.redColor(),colorBlendFactor:1.0,duration:0.15)

SKAction..waitForDuration(0.1)

SKAction.colorrizeWithColorBlendFactor(0.0,duration :0.15)]) monsterSprite.runAction(pulsedRed)

添加动作到节点

        绘制精灵仅仅绘制来静态图像。如果想要一个完整的游戏,添加游戏 剧本(game play),你需要能够让精灵在屏幕周围移动并执行其它 逻辑。SpriteKit让场景动起来所使用的主要机制是Action。

        通过Action定义你想对场景所作的改变。在大多数情况下,一个Actio n对执行该Action的节点应用其变化。举例来说,如果你想要屏幕上移 动精灵,你创建一个移动Action,并告诉精灵节点运行该Action。SpriteKit自动动态改变精灵的位置直到Action完成。

        一旦Action被创建,它的类型就不能再改变,并且只能有限的来改变其 属性。在此基础上,Spriter Kit利用Action不变性的性质非常有效地执行它们。

而一个Action只有在你告诉一个节点运行它之后才会执行,运行一个节点

最简单的方法是调用节点的runAction 方法。

let moveNodeUo = SKAction.moveByX(0.0,y:100.0,duration:1.0)

rocket.runAction(moveNodeUp)

Sprite Kit 提供了许多标准类型用来改变你的场景中的节点的属性,你 可以通过结合Action创建复杂和有表现力的动画,这些动画仍然通过运 行一个单一的Action来执行:

• 序列动作(sequence action)具有多个子动作。序列是一个连续运行 的动作结合(set),序列中的每一个动作在前一个动作结束后开始。

• 组动作(group action)具有多个子动作。组动作是一组在执行时就 同时执行的全部动作的集合(colllection)。

• 重复动作(repeating action )只有一个子动作。当子动作完成后, 它就重新启动,其允许循环另一个动作。

序列动作

let moveUp = SKAction.moveByX(0,y:100,duration:1) 

let zoom = SKAction.scaleTo(2.0,duration:0.25)

let wait = SKAction.waitForDuraion(0.5)

let fadeAway = SKAction.fadeOutWithDuraion(0.25)

 let removeNode = SKAction.removeFromParent()

let sequence = SKAction.sequence([moveup,zoom,wait,removeNode]) node.runAction(sequence)

序列动作

组动作

sprite.setScale(0)

let animate = SKAction.animateWith(0,y:100,duration:1)

let moveDown= SKAction.moveByX(0,y:-200,duration:2.0)

let scale = SKAction.scaleTo(1.0,duration:1.0)

let fadeIn = SKAction.fadeInWithDuration(1.0)

let group = SKAction.group([animate,moveDown,scale,fadeIn])

组动作

重复动作

let fadeOut = SKAction.fadeOutWithDuraion(1)

let fadeIn = SKAction.fadeInWithDuration(1)

let pulse = SKAction.sequence([fadeOut,fadeIn])

let pulseThreeTimes = SKActions.repeatAction(pulse,count:3)

 let pulseForever = SKAction.repeatActionForever(pulse)

重复动作

构建场景

场景的基本概念如下:

• 场景(SKScene对象),用来提供SKView对象要渲染的内容。

• 场景的内容被创建为树状的节点对象。场景是根节点。

• 在场景由视图呈现时,它运行动作并模拟物理,然后渲染节点树。

• 你可以通过子类化SKScene类创建自定义的场景。

节点给子节点提供坐标系。当一个节点被放置在节点树中,它的position属性把它定位在由它的父节点提供的坐标系内。SpriteKit在iOS和OS X中使用相同坐标系,并以点测量。

SpriteKit 有一个标准旋转约定(rotation convention)。弧度为0 的 角指定正x轴。沿逆时针方向为正角度。

创建场景:

• 场景由视图呈现。

• 场景的尺寸定义其可见区域。

• 场景渲染后它内容会复制到呈现试图。

• 如场景和视图尺寸不同,则会缩放场景。

创建节点树:

•通过创建节点之间父子关系创建节点树。

•每个节点维护一个有序的子节点列表,读取节点的children属性进行引用。

•子节点在树中的顺序会影响场景处理多个方面,包括碰撞检测(hit testing)和渲染,所以必须适当的组织节点树。

    

节点树的绘制顺序

场景间过渡

 场景是游戏的基本构建块。你为游戏各部分设计自包含(self-contained)的场景。然后在必要时在这些场景之间过渡,例如: • 在其他内容加载时的加载场景。

• 选择要玩什么游戏的主菜单场景。

• 用户验证的特定类型游戏的配置细节的场景。

• 提供游戏的场景。

• 当游戏结束时显示的场景。

当在一个已经呈现场景的视图上呈现新场景时,使用过渡动画,从而使场景变化显得自然。

SpriteKit的优点

• 它直接编译在iOS原生框架上:它没有必要去下载额外的库或者产生外部依赖。你可以在不依靠额外的插件的情况下无缝地使用其它比如像iAd,In-App Purchases等等之类的iOS框架。

• 它依赖你现有的技能:如果已经了解Swift和iOS的开发,你可以马上学 会Sprite Kit。

• 这是Apple官方提供的:它给你了你迁移到所有Apple新产品支持的优势。

• 这是免费的。

实例 RainCat: Demo

示例图

步骤:

• (为游戏)添加地面;

• (为游戏)添加雨滴;

• 初始化物理引擎;

• 添加雨伞对象,进行遮雨;

• 利用 categoryBitMask 和 contactTestBitMask 来实现碰撞检测;

• 创造一个全局边界( world boundary )来移除落出屏幕的结点( node )。

参考资料:《Sprite Kit Programming Guide》

上一篇下一篇

猜你喜欢

热点阅读