10.spritkit征程——使用Nodes来新增内容
上文讲到新的场景空无一物,略显凄凉,因此今天我们今天首要任务就是往里面填东西,比如:一架简陋的太空船。友情提示:请勿过分憧憬项目最后会给你呈现一架华丽的飞机。orz…..
我始终坚信把基础知识讲清楚,将全面,简单化比那些所谓的长篇大论、举例无数的书本来的美妙。因此我们首先来理清一下几个东西:
关键的几个概念:
SKView: 在SpriteKit
中扮演着作为视图呈现内容的重要角色,继承于UIView
。
SKNode: 是SpriteKit
中最最最最”老”的祖先,也就是父类。要知道Sprite Kit
中最基本的东东就是节点(Node
),举个不恰当的例子,分子原子组成了我们的世界(打个比方而已,别较真,博主化学不好),节点就好比是分子原子组成了Sprite Kit
的世界!那么世界上其他物种,比如树、泥土、动物都是由分子原子构成才有了形形色色的世界,同理在Sprite Kit
世界中,采用继承方式来创建新的“Node”,比如SKScene
、SKSpriteNode
、SpriteShapeNode
等等各司其职,从继承关系来说它们都是源自SKNode
,从本身来说不但继承了父类的属性方法,自己又开辟了一条道路。
节点树:首先请你抛开继承关系,来谈谈节点树,现在我们所知道的是在Sprite Kit
中都是由Node
组成。想象现在我们正在制作一款游戏,先要有一个场景(SKScene
),这是根节点;接下来可能需要来个文本(SKLabelNode
)来简单说下东西,再来一架飞机(SKSpriteNode
),它们都是隶属于场景中的,就是在根节点下分叉成2股;对了飞机上得搞个灯光,因此你在飞机节点上添加一个灯光(可能就是图片拉,当然也是SKSpriteNode
),这样在飞机节点下又加了一个节点。是不是有点树的感觉了??
理解完上面的概念,是时候来实战一把了:
通常我们使用SKSpriteNode
类来新增一些场景的内容,它对有纹理和无纹理对象都通吃!本文中我们创建一个没有纹理(无图片)的长方形,美名约:飞船。但是现在由于没有纹理,可能看上去很丑,不过这都预留着,假如有一天你发现了一个合适的图片,就给你的飞船换上吧。实际开发中,你可能需要创建数十个,或者上百个节点来呈现一个丰富的场景,但是基本原理都是差不多的拉!
本文中,首先创建一个飞船的骨架,就是一个长方形,此外还要创建灯光,这里就有两个Sprite node
了,但是我们不应该将他们都添加到场景中,为什么?因为灯光要随着飞船移动而移动,所以灯光sprite Node
应该添加到飞船这个sprite node
上,不难理解吧?
创建一架飞船
在
SpaceshipScene.swift
文件中找到createSceneContents
方法添加新内容:let spaceship:SkSpriteNode = newSpaceship() spaceship.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame)-150) self.addChild(spaceship)
实现
newSpaceship
方法:func newSpaceship()->SKSpriteNode{ //船体叫做hull let hull = SKSpriteNode(color: SKColor.grayColor(),size: CGSizeMake(64,32)) //创建动作 sequence传入的要是一个数组[],里面有4个动作,简单! let hover = SKAction.sequence let hover = SKAction.sequence([ SKAction.waitForDuration(1.0),SKAction.moveByX(100,y: 50,duration: 1.0),SKAction.waitForDuration(1.0),SKAction.moveByX(-100,y: -50,]) hull.runAction(SKAction.repeatActionForever(hover)) }
现在来Build and Run 下,看看效果。
刚才我们创建了船体,现在来增加飞船的灯光,在
newSpaceship
函数最下面添加以下代码://实例化一个灯光,该函数在下面给出 let light1 = newLight() light1.position = CGPointMake(-28.0,6.0) hull.addChild(light1) //实例化第二个灯光 let light2 = newLight() light2.position = CGPointMake(28.0,6.0) hull.addChild(light2)
实现
newLight
代码func newLight()->SKSpriteNode{ //纯手工敲代码,代码都是官方文档OC写的 //对着文档直接翻译成swift,有不对之处请留言 let light = SKSpriteNode(color: SKColor.grayColor(),size:CGSizeMake(8,8)) let blink = SKAction.sequence([ SKAction.fadeOutWithDuration(0.25),SKAction.fadeInWithDuration(0.25),]) let blinkForever = SKAction.repeatActionForever(blink) light.runAction(blinkForever) return light }
- Build and run!!!!