iOS SpriteKit 游戏

        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》

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

推荐阅读更多精彩内容