第二篇
纹理缩放
飞机好像太大了点,那是因为这张图片本身尺寸就很大,我们进入到images图片集里,选择spaceShip,将1x里的图拖拽到2x里,这样表示图片是支持retina2x的,在游戏中使用时长宽会被自动缩小一半,以显示出非常好的效果。
但是,运行一下会发现,好像飞机还是有点大,下面我们说一下如何缩放(你也可以试试将图片放在3x里,这是6+的屏幕)。
plane.xScale是横轴缩放值
plane.yScale是纵轴缩放值
plane.setScale()同时设置横轴纵轴缩放
下面,在addChild调用之前,设置:plane.setScale(0.5)
,好了,你会发现飞机长宽被缩小了一半。当然也可以单独设置横轴纵轴scale的值,来控制缩放。你也可以试试其他的数值,自己看看效果吧。
处理操作
关键的地方来了~我们要开始控制飞机飞行了。首先解释一下,sk中玩家每次操作,因为支持多点触摸,所以程序会受到一个触摸集合,里面包含每个触摸点的数据。不过我们暂时只关心单点触摸,也就是只处理集合中的一个点的数据。
首先,在集合中取出一个点,在touch中加入:let location:CGPoint! = touches.anyObject()?.locationInNode(self)
这就从场景节点中取出了玩家所触摸的位置坐标,然后我们取出在这个坐标上可能存在的某个node,这样就可以判断我们是否点击到了飞机。为了方便判断,我们在addChild之前,设置飞机的名字为planeplane.name = "plane"
然后,回到touch方法中,继续在下面加入:
var node = self.nodeAtPoint(location)
if node.name == "plane"{
//you choose the plane
}
然后,我们需要两个新的函数,touchesMove和touchesEnded,前者在触摸之后,移动手指的时候触发,后者在触摸操作结束之后触发。同时,需要在类里添加一个成员属性isTouched,类型是bool,然后在move函数中,实时修改飞机坐标。最终代码如下:
class GameScene: SKScene {
var planeTexture = SKTexture(imageNamed: "Spaceship")//可以在Images.xcassets中找到默认飞船图片
var plane:SKSpriteNode!
var isTouched = false
override func didMoveToView(view: SKView) {
/* Setup your scene here */
plane = SKSpriteNode(texture: planeTexture)
plane.position = CGPointMake(self.size.width * 0.5, self.size.height * 0.5)//self是指当前场景,左下角为坐标原点
plane.setScale(0.5)
plane.name = "plane"
self.addChild(plane)
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
/* Called when a touch begins */
var location:CGPoint! = touches.anyObject()?.locationInNode(self)
var node = self.nodeAtPoint(location)
if node.name == "plane" {
isTouched = true
}
}
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
if isTouched {
var location:CGPoint! = touches.anyObject()?.locationInNode(self)
plane.position = CGPointMake(location.x, location.y)
}
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
isTouched = false
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
}
}
现在,你可以在模拟器里,四处拖拽飞机进行移动了。