
3.4 设置精灵
本节将讲解对精灵的一些设置,如精灵位置、锚点、着色、缩放、旋转等内容。
3.4.1 设置精灵的位置
在图3.11和图3.12中可以看到代表精灵的图像并没有完全地显示在场景中,而是只有一部分。此时需要开发者对精灵的位置进行设置。设置精灵的位置需要使用到position属性。其语法形式如下:
var position: CGPoint
其中,position属性的类型为CGPoint。它是一个简单的结构,由x和y组成,其形式如下:
struct CGPoint { var x: CGFloat var y: CGFloat }
其中,x表示在x轴中的位置,y表示在y轴中的位置。
【示例3-3】以示例3-2为基础,改变精灵的位置,从而让图像全部显示在场景中,代码如下:
import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { var splash=SKSpriteNode(imageNamed:"1.jpg") //改变精灵的位置 splash.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)) self.addChild(splash) } }
此时运行程序,会看到如图3.13所示的效果。

图3.13 运行效果
3.4.2 设置锚点
默认情况下,精灵的框架及其纹理的中心定位在精灵的位置上。然而,开发者可能想要将纹理的不同部分出现在精灵显示的位置上。SKSpriteNode节点的anchorPoint属性决定框架的哪一点定位在精灵的位置上。这个点就被称为锚点。其语法形式如下:
var anchorPoint: CGPoint
其中,anchorPoint的属性类型也为CGPoint。锚点是一个很抽象的概念,可以想象用图钉在墙上钉上一张卡片,卡片就相当于节点,墙壁就相当于设备的屏幕或者场景,而图钉就是锚点。锚点在单位坐标系(unit coordinate system)中指定如图3.14所示。

图3.14 单位坐标系
单位坐标系的原点位于框架的左下角,而(1,1)位于框架的右上角。精灵的锚点默认为(0.5,0.5),对应于框架的中心。
【示例3-4】以示例3-3为基础,使用锚点改变精灵的位置,代码如下:
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
var splash=SKSpriteNode(imageNamed:"1.jpg")
splash.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame))
//设置锚点
splash.anchorPoint=CGPointMake(1.0, 0.5)
self.addChild(splash)
}
}
此时运行程序,会看到如图3.15所示的效果。

图3.15 运行效果
3.4.3 对精灵着色
为精灵着色在很多的化妆类游戏中经常使用到,如图3.16所示。

图3.16 Nail Salon
图3.16是Nail Salon游戏的截图,当玩家为手选择肤色后,就会将手的颜色自动变为选择的颜色。为精灵着色需要开发者使用color和colorBlendFactor属性实现。其中color属性的语法形式如下:
var color: UIColor
colorBlendFactor属性的语法形式如下:
var colorBlendFactor: CGFloat
其中,colorBlendFacto属性是一个CGFloat,它是一个浮点值,这个值的范围在0.0到1.0之间。默认情况下的颜色混合因子为0.0,这表明纹理未经更改地使用。
【示例3-5】以下将为显示在场景中的精灵进行着色,具体操作步骤如下:
(1)创建一个Game类型的项目,命名为3-2。
(2)添加图像1.jpg到创建项目的Supporting Files文件夹中。
(3)将设备的方向设置为水平方向。
(4)打开GameScene.swift文件,将此文件中多余的代码删除,然后编写新的代码,此代码实现的功能是显示一个精灵到场景中,并对此精灵进行着色。代码如下:
import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { var splash=SKSpriteNode(imageNamed:"1.jpg") splash.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)) //为精灵着色 splash.color=SKColor.greenColor() splash.colorBlendFactor=0.5 self.addChild(splash) } }
此时运行程序,会看到如图3.17所示的效果。

图3.17 运行效果
3.4.4 调整精灵的尺寸
精灵的size属性用于指定精灵的尺寸,此尺寸是无缩放的。当一个纹理精灵初始化时,这个属性的值被初始化为与精灵的纹理的尺寸相等的尺寸。当然也可以单独地对精灵的尺寸进行修改,其语法形式如下:
var size: CGSize
其中,size属性的类型为CGSize。CGSize和CGPoint一样也是一个简单的结构,由width和height组成,其形式如下:
struct CGSize { var width: CGFloat var height: CGFloat }
其中,width用来设置宽度,height用来设置高度。
【示例3-6】以下将为显示的场景中的精灵重新设置尺寸,具体操作步骤如下:
(1)创建一个Game类型的项目,命名为3-3。
(2)添加图像1.jpg到创建项目的Supporting Files文件夹中。
(3)将设备的方向设置为水平方向。
(4)打开GameScene.swift文件,将此文件中多余的代码删除,然后编写新的代码,此代码实现的功能是显示一个精灵到场景中,并对此精灵的尺寸进行设置。代码如下:
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
var splash=SKSpriteNode(imageNamed:"1.jpg")
splash.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame))
splash.size=CGSizeMake(1440, 900) //设置尺寸
self.addChild(splash)
}
}
此时运行程序,会看到如图3.18所示的效果。

图3.18 运行效果
注意:size属性不仅可以对精灵的尺寸进行设置,还可以获取精灵的尺寸。
【示例3-7】以下将以示例3-6为基础,使用size属性获取精灵的尺寸,代码如下:
import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { var splash=SKSpriteNode(imageNamed:"1.jpg") splash.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)) splash.size=CGSizeMake(1440, 900) //获取精灵的尺寸并输出 let mySize = splash.size println("Size: \(mySize)") self.addChild(splash) } }
此时运行程序,会在应用程序输出窗口看到如图3.19所示的效果。

图3.19 运行效果
3.4.5 缩放精灵
缩放精灵是游戏中最常见到的效果,如在超级玛丽中,当玛丽吃了蘑菇后就会变大,如图3.20所示。

图3.20 超级玛丽
其实精灵的缩放可以使用setScale()方法实现,其语法形式如下:
func setScale(_ scale: CGFloat)
其中,_ scale用来表示精灵缩放的倍数。
【示例3-8】以下将场景中显示的精灵使用setScale()方法放大4倍。具体的操作步骤如下:
(1)创建一个Game类型的项目,命名为3-4。
(2)添加图像1.jpg到创建项目的Supporting Files文件夹中。
(3)将设备的方向设置为水平方向。
(4)打开GameScene.swift文件,将此文件中多余的代码删除,然后编写新的代码,此代码实现的功能是显示一个精灵到场景中,并对此精灵放大4倍。代码如下:
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
var splash=SKSpriteNode(imageNamed:"1.jpg")
splash.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame))
splash.setScale(4.0) //放大精灵
self.addChild(splash)
}
}
此时运行程序,会看到如图3.21所示的效果。

图3.21 运行效果
注意:setScale()方法进行缩放时,将宽度和高度都以相同的倍数进行缩放。这样可以使图片不会产生变形。如果开发者只想要实现将宽度或者高度进行缩放该怎么办呢?如果只想缩放宽度,需要使用xScale属性,其语法形式如下:
var xScale: CGFloat
如果只想缩放高度,需要使用yScale属性,其语法形式如下:
var yScale: CGFloat
【示例3-9】以下将场景中显示的精灵的宽度通过xScale属性放大2倍。具体的操作步骤如下:
(1)创建一个Game类型的项目,命名为3-5。
(2)添加图像1.jpg到创建项目的Supporting Files文件夹中。
(3)将设备的方向设置为水平方向。
(4)打开GameScene.swift文件,将此文件中多余的代码删除,然后编写新的代码,此代码实现的功能是显示一个精灵到场景中,并对此精灵的宽度放大2倍。代码如下:
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
var splash=SKSpriteNode(imageNamed:"1.jpg")
splash.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame))
splash.xScale=2 //缩放精灵
self.addChild(splash)
}
}
此时运行程序,会看到如图3.22所示的效果。

图3.22 运行效果
3.4.6 旋转精灵
游戏中经常会进行精灵的旋转,如在过山车游戏中,当过山车遇到上坡时,过山车就会进行相应的角度的旋转,如图3.23所示。

图3.23 过山车
如果想要让精灵进行旋转,需要使用到zRotation属性,其语法形式如下:
var zRotation: CGFloat
其中,zRotation属性的类型为一个CGFloat,它是一个浮点型的数值。默认情况下该值为0,表示没有旋转。正值表示逆时针旋转,负值表示顺时针旋转。
【示例3-10】以下将场景中显示的精灵进行45度旋转,具体的操作步骤如下:
(1)创建一个Game类型的项目,命名为3-6。
(2)添加图像1.jpg到创建项目的Supporting Files文件夹中。
(3)将设备的方向设置为水平方向。
(4)打开GameScene.swift文件,将此文件中多余的代码删除,然后编写新的代码。此代码实现的功能是显示一个精灵到场景中,并对此精灵逆时针旋转45度。代码如下:
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
var splash=SKSpriteNode(imageNamed:"1.jpg")
splash.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame))
splash.zRotation=CGFloat(M_PI) / 4 //旋转
self.addChild(splash)
}
}
此时运行程序,会看到如图3.24所示的效果。

图3.24 运行效果
3.4.7 设置精灵的透明度
透明度在游戏中是经常出现的,在忍者的游戏中,都会使用透明度来实现一些隐身效果。在化妆的游戏中可以使用透明度来实现一些类似指甲的效果,如图3.25所示。

图3.25 Nail Salon
精灵的透明度可以使用alpha属性进行设置,其语法形式如下:
var alpha: CGFloat
其中,alpha属性的类型为一个CGFloat,它是一个浮点型的数值,默认情况下该值为1,表示不透明。这个值的范围在0.0~1.0之间。
【示例3-11】以下将场景中显示的精灵设置为半透明,即透明度为0.5。具体的操作步骤如下:
(1)创建一个Game类型的项目,命名为3-7。
(2)添加图像1.jpg到创建项目的Supporting Files文件夹中。
(3)将设备的方向设置为水平方向。
(4)打开GameScene.swift文件,将此文件中多余的代码删除,然后编写新的代码,此代码实现的功能是显示一个精灵到场景中,并对此精灵的透明度进行设置。代码如下:
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
var splash=SKSpriteNode(imageNamed:"1.jpg")
splash.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame))
splash.alpha=0.5 //设置透明度
self.addChild(splash)
}
}
此时运行程序,会看到如图3.26所示的效果。

图3.26 运行效果
3.4.8 隐藏精灵
精灵的隐藏一般会使用在连连看等一系列的配对游戏中,如图3.27所示。

图3.27 水果连连看
图3.27是关于水果连连看的截图,当玩家找到两个相同的水果后,就将这两个水果进行隐藏。隐藏设置一般需要使用hidden属性,其语法形式如下:
var hidden: Bool
其中,hidden属性的类型为Bool类型。当Bool值为true时,表明隐藏精灵;当Bool值为false时,表明不隐藏精灵。
【示例3-12】以下将场景中出现的精灵使用hidden属性进行隐藏。具体的操作步骤如下:
(1)创建一个Game类型的项目,命名为3-8。
(2)添加图像1.jpg到创建项目的Supporting Files文件夹中。
(3)将设备的方向设置为水平方向。
(4)打开GameScene.swift文件,将此文件中多余的代码删除,然后编写新的代码,此代码实现的功能是显示一个精灵到场景中,并对此精灵进行隐藏。代码如下:
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
var splash=SKSpriteNode(imageNamed:"1.jpg")
splash.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame))
splash.hidden=true //隐藏精灵
self.addChild(splash)
}
}
此时运行程序,会看到如图3.28所示的效果。

图3.28 运行效果