(原创)swift+spritekit中文教程第二篇

第二篇

纹理缩放

飞机好像太大了点,那是因为这张图片本身尺寸就很大,我们进入到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之前,设置飞机的名字为plane
plane.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 */
    }
} 

现在,你可以在模拟器里,四处拖拽飞机进行移动了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值