11.spritekit征程——结尾篇之节点的狂欢

前端之家收集整理的这篇文章主要介绍了11.spritekit征程——结尾篇之节点的狂欢前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

11.spriteKit征程——结尾篇之节点的狂欢

本文是sprite kit征程的结尾篇,当然这仅仅还只是开始。另外我已经完成一款sprite Kit的教学软件。希望多多支持。swift技术讨论群:392436022,非水群,欢迎一起探讨。

小节目录:
01.关于sprite_kit
02.SpriteKit前瞻之视图场景
03.sprite_kit前瞻之节点树
04.sprite_kit前瞻之纹理
05.sprite_kit前瞻之节点的动画
06.sprite_kit前瞻之创造“真实”的世界
07.spritekit征程——创建第一个场景
08.spritekit征程——场景中的动画
09.spritekit征程——场景的切换
10.spritkit征程——使用nodes来新增内容
11.spriteKit征程——结尾篇之节点的狂欢

此外我的SpriteKit Note App已经在store中上架了,免费、无内购、无广告、实时更新文档内容代码。欢迎下载,链接地址https://itunes.apple.com/cn/app/spritekit-note/id973093466?mt=8
结束了入门篇,接下来是精灵进阶篇,预计要一个月开始,不过app中将提前放入,希望各位支持下载完之后给个好评。

正题:

以我们目前掌握的知识来说,可以创建多场景,多元素,以及节点各自执行动作,这看起来很棒了,起码能拿的出手喽。但在实际游戏开发中,众多节点必定彼此交互才能擦出绚烂的火花。本文将接着上面的例子来演示,具体任务是:添加新的节点(nodes,目前来说 我相信很多从头看起的同志应该理解节点的含义了)到场景中,然后我们将采用物理系统来模拟它们的运行和执行碰撞效果。非常酷的东西!

ActionPhysic World的讨论
Sprite Kit框架提供了完整一套物理引擎来模拟一个近乎真实的世界,配置好之中的节点物理属性便能自动被执行!当然之前我们也谈到了Action,通过设计一套动作让节点执行,当然也不错喽。现在有了Physic World,负担大大减轻,比如你只需要配置节点的质量,初速度等(和现实生活联系起来)属性,完了放入物理世界中即可,将自动被执行,假如节点与节点之间产生了碰撞,物理系统检测到之后能够自动演算和执行结果。 非常牛逼!

实战演示,在Spaceship 场景中增加物理模拟

  1. 找到newSpaceship方法,新增一个属性叫做physics body,顾名思义就是物理体,有质量,速度,加速度等一系列属性,将其添加到飞船这个实例上,追根求源就是在SKNode中有一个属性叫做physicsBody,属于SKPhysicsBody类。首先它是可选类型(?),假如不初始化默认就是nil。现在给我们的spaceship添加一个物理体吧。

    hull.physicsBody = SKPhysicsBody(rectangleOfSize: hull.size)
  2. 试着Build and Run ,你会发现”bie~”一下飞船掉落了。。。。因为添加了物理体,在重力作用下自然掉落。另外先前的Action还是在执行的,但是仍然无法阻止掉落…

  3. 飞船怎么能掉落呢!所以我们来阻止它。

    hull.physicsBody.dynamic = false

    如此当我们运行时候,太空船不再受重力影响,能够和先前一样工作了。抛一个问题:既然和先前一样,为什么还要给它添加一个物理体?好问题!因为之后我们要涉及到碰撞问题!凡是节点于节点之间交互,我们都必须赋予它们物理体(physics body)。这里我们迫使船体物理体为static,于dynamic相对嘛!,这样就算有碰撞也不回影响到飞船的速度拉!

  4. 找到 createSceneContents函数,我们来添加产生(spawn,这个词语以后经常用到)岩石的代码,要知道宇宙中充满了危机!

    //SpaceshipScene 场景源源不断的产生岩石!!
    //先定义个动作,这个动作就是执行产生岩石函数!
    let makeRocks = SKAction.sequence([
       SKAction.runBlock(addRock),SKAction.waitForDuration(0.10,withRange: 0.15)
    ])
    self.runAction(SKAction.repeatActionForever(makeRocks))

    场景也是一个节点。自然也能运行一套动作喽!上面Action代码所要执行的就是调用一个addRock方法,而且是间隔一段时间调用一次,当然产生一块岩石,我们就需要等待一段时间,不过等待的时间是随机的(0.10±0.15).强调下!这里使用了runBlock()闭包方法,和官方文档不同

  5. 实现addRock方法

    //都是随机函数 没啥好看
    func skRandf()->CGFloat{
        return CGFloat(CGFloat(random()) / CGFloat(RAND_MAX))
    }
    
    func skRand(low:CGFloat,high:CGFloat)->CGFloat{
        return skRandf() * (high - low) + low
    }
    //着重看这里!
    func addRock(){
        //设定精灵颜色 和 大小
        let rock = SKSpriteNode(color: SKColor.brownColor(),size: CGSizeMake(8,8))
    
        //产生位置是随机的哦
        rock.position = CGPointMake(skRand(0,high: self.size.width),self.size.height-50)
        //名字
        rock.name = "rock"
        //设定物理体 这样就能自由落体喽
        rock.physicsBody = SKPhysicsBody(rectangleOfSize: rock.size)
        rock.physicsBody?.usesPreciseCollisionDetection = true
    
        //添加到场景中 self 就是spaceshipScene 场景
        self.addChild(rock)
    }
  6. Build and run!! 下起了岩石雨,这个我亲自运行了一个demo,可行的!

  7. 实现碰撞!didSimulatePhysics方法添加到场景中!当岩石下坠离开屏幕后从场景中移除!

    override func didSimulatePhysics() {
        self.enumerateChildNodesWithName("rock",usingBlock: {
            node,stop in
            if node.position.y < 0{
                node.removeFromParent()
            }
        })
    }
  8. 谢幕! 暂时告一段落,不懂请博客留言!
原文链接:https://www.f2er.com/swift/327549.html

猜你在找的Swift相关文章