10.spritkit征程——使用nodes来新增内容

10.spritkit征程——使用Nodes来新增内容

上文讲到新的场景空无一物,略显凄凉,因此今天我们今天首要任务就是往里面填东西,比如:一架简陋的太空船。友情提示:请勿过分憧憬项目最后会给你呈现一架华丽的飞机。orz…..

我始终坚信把基础知识讲清楚,将全面,简单化比那些所谓的长篇大论、举例无数的书本来的美妙。因此我们首先来理清一下几个东西:

关键的几个概念:

SKView: 在SpriteKit中扮演着作为视图呈现内容的重要角色,继承于UIView

SKNode: 是SpriteKit中最最最最”老”的祖先,也就是父类。要知道Sprite Kit中最基本的东东就是节点(Node),举个不恰当的例子,分子原子组成了我们的世界(打个比方而已,别较真,博主化学不好),节点就好比是分子原子组成了Sprite Kit的世界!那么世界上其他物种,比如树、泥土、动物都是由分子原子构成才有了形形色色的世界,同理在Sprite Kit世界中,采用继承方式来创建新的“Node”,比如SKSceneSKSpriteNodeSpriteShapeNode等等各司其职,从继承关系来说它们都是源自SKNode,从本身来说不但继承了父类的属性方法,自己又开辟了一条道路。

节点树:首先请你抛开继承关系,来谈谈节点树,现在我们所知道的是在Sprite Kit中都是由Node组成。想象现在我们正在制作一款游戏,先要有一个场景(SKScene),这是根节点;接下来可能需要来个文本(SKLabelNode)来简单说下东西,再来一架飞机(SKSpriteNode),它们都是隶属于场景中的,就是在根节点下分叉成2股;对了飞机上得搞个灯光,因此你在飞机节点上添加一个灯光(可能就是图片拉,当然也是SKSpriteNode),这样在飞机节点下又加了一个节点。是不是有点树的感觉了??

理解完上面的概念,是时候来实战一把了:

通常我们使用SKSpriteNode 类来新增一些场景的内容,它对有纹理和无纹理对象都通吃!本文中我们创建一个没有纹理(无图片)的长方形,美名约:飞船。但是现在由于没有纹理,可能看上去很丑,不过这都预留着,假如有一天你发现了一个合适的图片,就给你的飞船换上吧。实际开发中,你可能需要创建数十个,或者上百个节点来呈现一个丰富的场景,但是基本原理都是差不多的拉!

本文中,首先创建一个飞船的骨架,就是一个长方形,此外还要创建灯光,这里就有两个Sprite node了,但是我们不应该将他们都添加到场景中,为什么?因为灯光要随着飞船移动而移动,所以灯光sprite Node应该添加到飞船这个sprite node上,不难理解吧?

创建一架飞船

  1. SpaceshipScene.swift文件中找到createSceneContents方法添加新内容:

    let spaceship:SkSpriteNode = newSpaceship()
    spaceship.position = CGPointMake(CGRectGetMidX(self.frame),
              CGRectGetMidY(self.frame)-150)
    self.addChild(spaceship)
    
  2. 实现newSpaceship方法:
    func newSpaceship()->SKSpriteNode{
        //船体叫做hull
        let hull = SKSpriteNode(color: SKColor.grayColor(), size: CGSizeMake(64, 32))
        //创建动作 sequence传入的要是一个数组[],里面有4个动作,简单!
        let hover = SKAction.sequence
                let hover = SKAction.sequence([
            SKAction.waitForDuration(1.0),
            SKAction.moveByX(100, y: 50, duration: 1.0),
            SKAction.waitForDuration(1.0),
            SKAction.moveByX(-100, y: -50, duration: 1.0),
        ])
        hull.runAction(SKAction.repeatActionForever(hover))
    }
    
  3. 现在来Build and Run 下,看看效果。
  4. 刚才我们创建了船体,现在来增加飞船的灯光,在newSpaceship函数最下面添加以下代码:
    //实例化一个灯光,该函数在下面给出
    let light1 = newLight()
    light1.position = CGPointMake(-28.0,6.0)
    hull.addChild(light1)
    
    //实例化第二个灯光
    let light2 = newLight()
    light2.position = CGPointMake(28.0,6.0)
    hull.addChild(light2)
    
  5. 实现newLight代码
    func newLight()->SKSpriteNode{
        //纯手工敲代码,代码都是官方文档OC写的
        //对着文档直接翻译成swift,有不对之处请留言
        let light = SKSpriteNode(color: SKColor.grayColor(),
        size:CGSizeMake(8, 8))
    
        let blink = SKAction.sequence([
            SKAction.fadeOutWithDuration(0.25),
            SKAction.fadeInWithDuration(0.25),
        ])
        let blinkForever = SKAction.repeatActionForever(blink)
    
        light.runAction(blinkForever)
    
        return light
    }
    
  6. Build and run!!!!
时间: 2024-10-30 18:56:16

10.spritkit征程——使用nodes来新增内容的相关文章

chattr和lsattr命令,不能被删除、改名、设定链接关系,同时不能写入或新增内容

chattr和lsattr命令详解 chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现.同样-D检查压缩文件中的错误的功能,需要2.5.19以上内核才能支持.另外,通过chattr命令修改属性能够提高系统的安全 性,但是它并不适合所有的目录.chattr命令不能保护/./dev./tmp./var目录. lsattr比较简单,只是显示文件的属性[root]#lsattr ----ia---j--- ./lsattr_te

AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码

AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码 添加Watch应用对象时新增内容介绍 Watch应用对象添加到创建的项目中后,会包含两个部分:Watch App 和 WatchKit Extension,如图2.18所示.其中,Watch App部分位于用户的iWatch上,它目前为止只允许包含Storyboard文件和Resources文件.在我们的项目里,这一部分不包括任何代码.WatchKit Extension部分位于用户的iPhone安装的对应App上,这

<JAVA8新增内容>关于集合的操作(Collection/Iterator/Stream)

因为下文频繁使用lambda表达式,关于Java中的lambda表达式内容请见: http://www.cnblogs.com/guguli/p/4394676.html 一.使用增强的Iterator遍历集合元素 Iterator接口也是Java集合框架的成员,但它与Collection系列,Map系列的集合不一样:Collection系列集合,Map系列集合主要用于承装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器

h5新增内容

一.h5新增标签:摘取w3cSchool: <article>定义 article.<aside> 定义页面内容之外的内容. <footer> 定义 section 或 page 的页脚.<header>定义 section 或 page 的页眉.<section>定义 section. <nav>定义导航链接. <canvas> 定义图形.<audio> 定义声音内容. <video>定义视频.&

HTML5新增内容

1. HTML5 标准还在制定中 首先要注意的是,HTML5虽然现在很火,但是HTML5标准还在制定中,标准仍在改变.HtML4已经10多年了,不会有任何改变了. 2. 简化的语法 HTML5简化了很多细微的语法,例如doctype的声明,你只需要写<!doctype html>就行了.HTML5与HTML5,XHTML1兼容,但是与SGML不兼容. 3. <canvas>标签替代Flash Flash给很多Web开发者带来了麻烦,要在网页上播放Flash需要一堆代码和插件.<

【iOS开发-17】UITextView属性,点击新增内容案例,及UITextViewDelegate里光标/值变化的操作方法

(1)UITextView和UITextField的区别可以(简单)理解为,前者是一块区域可以写很多东西有换行滚动条神马的,后者只有一行文本,类似于html里面的textarea和text. (2)在本例中,我们利用一个UITextField和一个UIButton不断把UITextField里面的内容加到UITextView的最后一行.这里面用到给按钮增加 一个事件,并在事件里面把UITextField.text加到UITextView.text的后面. (3)在本例中为了用户体验,可以设置每次

jQuery.1.9 live 代替事件 on 新增内容无法触发事件

如果是新增 append 或者 html() 事件添加的内容,无法触发 click 事件, 在1.9 可以用live 事件来代替 1.9以后用 <div class="search-result-list"> <ul> <li data='11'>我是内容</li> <li data='12'>我是内容</li> </ul> </div> 如果<li>是新增的内容 , 就无法触发

Web 在线文件管理器学习笔记与总结(10)查看文件夹中的内容

① 读取文件夹大小 a. 封装计算文件夹大小的函数 b.  打开文件夹 c. 循环判断文件夹下的内容是文件还是文件夹,如果是文件,则累积相加文件的大小:如果是文件夹,则递归调用该函数 注意两个问题: a. 在计算每个文件夹大小之前,应该清空变量 $size,否则文件夹大小会累加(index.php) <td><?php $size = 0; echo transByte(dirSize($p));?></td> b. 在计算文件夹大小的方法中,$size 应该设置为全局

HTML5+CSS3新增内容总结!!!!!绝对干货

说到H5C3会不会觉得东西好多啊,今天就整理了一份总结性的内容: CSS3选择器有哪些?答:属性选择器.伪类选择器.伪元素选择器.CSS3新特性有哪些?答:1.颜色:新增RGBA,HSLA模式 文字阴影(text-shadow.) 边框: 圆角(border-radius)边框阴影: box-shadow 盒子模型:box-sizing 背景:background-size 设置背景图片的尺寸background-origin 设置背景图片的原点background-clip 设置背景图片的裁切