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

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

本文是sprite kit征程的结尾篇,当然这仅仅还只是开始。另外我已经完成一款sprite Kit的教学软件。希望多多支持。

小节目录:

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. 谢幕! 暂时告一段落,不懂请博客留言!
时间: 2024-11-08 23:39:47

11.spritekit征程——结尾篇之节点的狂欢的相关文章

08.spritekit征程——场景中的动画

08.spritekit征程--场景中的动画 接着上文,显示静态的文字是否无法满足你的欲望,那么本文的内容绝对让你热血沸腾,记得小时候爱看动画,现在有这么一个机会让你来创作是不是想想都有点小激动呢. 动画的核心呢就是actions.在Sprite Kit 中的大多数action 其实就是改变节点(Node)的属性罢了.假如你还不了解节点是什么,建议好好谷歌百度下,虽说都是最基础的知识,但是我认为"万丈大楼平地起",打好基础很是关键,另外就是坚持. 关于节点: 节点是最简单也是最难理解的

07.spritekit征程——创建第一个场景

07.SpriteKit征程--创建第一个场景 Sprite Kit 的内容被放置于窗口当中,即那些可视内容.Sprite Kit 之中的内容由SKView 类进行渲染(注:一般将普通的UIView转换成SKView是这么写的let skView = self.view as SKView ).由SKView 对象渲染的内容称之为场景,也就是Scene,它隶属于SKScene类.场景作为一个root node 又继承于UIResponder类,因此它能够响应用户的输入,当然还有其他丰富的内容使得

【RAC】 RAC For W2K8R2 安装--结尾篇(十)

[RAC] RAC For W2K8R2 安装--结尾篇(十) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① RAC for windows 2008R2 的安装 ② rac环境下共享存储的规划和搭建 ③ starwind软件的应用 ④ VMware workstation 如何做共享存储 ⑤ rac数据的静默安装和dbca静默建库 ⑥ rac数据库在windo

[C++11新特性]第二篇

0.可变数量参数,可变函数模版,变长模版类 c++98可变数量参数 #include<cstdio> #include<cstdarg> double SumOfFloat(int count, ...) { va_list ap; double sum=0; va_start(ap,count); for(int i=0;i<count;i++) sum+=va_arg(ap,double); va_end(ap); return sum; } int main() { p

09.spritekit征程——场景的切换

09.spritekit征程--场景的切换 上文讲到咱们的小精灵(sprite)在场景中"舞动",枯燥的学习似乎有了那么点意思.我相信各位看官都是想自己开发一款独有的游戏,自然就少不了绚丽的效果以及开场.因此今天咱们来对场景之间的切换进行入门. Sprite Kit对场景之间的切换简单到爆.在下面的例子当中,我们将创建第二个场景来学习其他游戏特性.前面的动画效果最终会导致"Hello World"文本从屏幕淡出,但这仅仅只发生在当然场景中.今天我们的任务是当文本消失

Nginx实战系列之功能篇----后端节点健康检查(转)

公司前一段对业务线上的nginx做了整理,重点就是对nginx上负载均衡器的后端节点做健康检查.目前,nginx对后端节点健康检查的方式主要有3种,这里列出:   1.ngx_http_proxy_module 模块和ngx_http_upstream_module模块(自带)    官网地址:http://nginx.org/cn/docs/http/ng ... proxy_next_upstream2.nginx_upstream_check_module模块    官网网址:https:

第11题:求二叉树中节点的最大距离

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/44984331 第11题:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离. 树的高度是一个重要信息,然后就可以祭出递归大法了. 代码 package test011; import test004.Node; /** * Created by cq o

Nginx实战系列之功能篇----后端节点健康检查

公司前一段对业务线上的nginx做了整理,重点就是对nginx上负载均衡器的后端节点做健康检查.目前,nginx对后端节点健康检查的方式主要有3种,这里列出: 1.ngx_http_proxy_module 模块和ngx_http_upstream_module模块(自带)     官网地址:http://nginx.org/cn/docs/http/ngx_http_proxy_module.html#proxy_next_upstream 2.nginx_upstream_check_mod

Javascript进阶篇——(DOM—节点---属性、访问节点)—笔记整理

节点属性在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType :节点的类型 一.nodeName 属性: 节点的名称,是只读的. 1. 元素节点的 nodeName 与标签名相同 2. 属性节点的 nodeName 是属性的名称 3. 文本节点的 nodeName 永远是 #text 4. 文档节点的 nodeName 永远是 #document 二.nodeV