13.精灵进阶之干活篇

13.精灵进阶之干活篇上

前文曾提及一种创建有纹理的精灵一步到位的方法,即在创建sprite同时也创建了相应地texture,不知客官还有印象。无疑这是一种简便的方法,但往往在实际开发一款复杂游戏时,你需要全盘接管纹理,比如遇到以下几种情况:

  • 多精灵之间共用一个纹理(简单理解成可复用的图片吧,虽然不是很恰当)。
  • 假如已经创建完一个有纹理精灵,此时你想更换一个新的纹理给它。
  • 采用一个纹理集合制作精灵动画。
  • 有时候创建纹理的数据并非来自于app bundle,比如从网络下载。
  • 将纹理预(提前)加载到内存中,当然是在呈现场景之前。

接下来我们将频繁接触SKTexture对象,生成纹理之后在使用它来创建一个新的精灵或为已存在的精灵“换装”。

加载App Bundle中的图片创建纹理

我想这是最常用的方法了,当你的设计师为你设计好一套图片,由你导入应用中,然后在实际代码中加载即可。通常代码是这样写的:

    //代码纯手工打入,且已简单形式给出 关键部分必定详细
    //只创建一次纹理即可 所以叫可复用图片 也就是多次使用
    let rocketTexture = SKTexture(imageNamed:"rocket.png")
    for i = 0;i<0;i++{
        let rocket = SKSpriteNode(texture:rocketTexture)
        rocket.position =  ... //自己定吧
        self.addChild(rocket)
    }

有时候纹理对象本身就好比一个占位符,不过已经包含了实打实的纹理数据(记住:程序都是0、1组成,到最后都是一串0、1),或许是因为纹理数据资源占用量大(我的理解),所以Sprite Kit 只会在有需要时才加载到内存中。

使用纹理图册(Texture Atlases)

实际开发中,我们会有灰常灰常多的图片,如果细分之下或许被归类到不同分类之中,比如人物的面貌一类、怪物的面貌一类、背景一类等等,这样有效的管理自然Sprite Kit也是支持的,也就是Texture Atlases,怎么划分来的合理呢?官方文档给了以下几种:

  • 一个人物的动画帧(比如一套技能动作或者人物行进动作 往往就是几张或十几张图片组成)。
  • 游戏的关卡图片。
  • 一些控件的图片(button,switch,slider等)

试想下,假如我们不有效管理这些散乱的对象,SpriteKit和图形硬件估计要累的够呛,自然你的游戏执行效果也不会太理想。现在有了Texture Atlases,一切都将变得美好。尽管现在是一个纹理图册,但是你仍然可以通过SKTexture来使用它们。

创建纹理图册

创建方法其实很简单,只需要把一个文件的后缀名改成atlas即可。

这一小节到此结束,谢谢,再见!

等等,这并非我的意愿,那么我们来谈及下如何用好一个纹理图册。

试想下我们创建了一个纹理图册,可曾考虑过里面的内容过多或是过少,如何平衡是个关键点!假如过少,那么意义不大,Sprite Kit执行效率还是很低,但是如果一股脑的全部放入,那么多纹理数据全局放入内存中,估计够呛!说到最后,你才是主导者,有效的分类,以及在多个纹理图集之间切换我想是最好的方法。

下集高潮来临,如何将纹理放入到纹理图集并运用,谢谢观看,在再见!

时间: 2024-12-09 23:27:32

13.精灵进阶之干活篇的相关文章

【译】SQL Server索引进阶第八篇:唯一索引

原文:[译]SQL Server索引进阶第八篇:唯一索引     索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其反,可以说"成也索引,败也索引".     本系列文章来自Stairway to SQL Server Indexes,翻译和整理后发布在agilesharp和博客园,希望对广大的技术朋友在如何使用索引上有所帮助.   唯一

JSON进阶第三篇 apache多域名及JSON的跨域问题(JSONP)

本文先介绍如何为apache配置多域名,然后再用JSONP(JSON with Padding)来解决JSON的跨域问题. 阅读本文之前,推荐先参阅<JSON进阶第二篇AJAX方式传递JSON数据>. 一.apache配置多域名 在apache的conf目录下找到httpd.conf,然后在该文件最后增加如下内容: # 声明使用虚拟主机过滤规则 NameVirtualHost*:80 #虚拟主机localhost <VirtualHost*:80> ServerName  loca

16.精灵进阶之节点命名

16.精灵进阶之节点下篇 一般情况下,想要知道节点正在执行哪个动作,你一无所知:想要移除众多动作中的一个,你却只能删除所有.你还在苦恼吗?那么给"动作命名"(named actions)消除以上所有的障碍.已命名的动作都使用一个独一无二的关键字(key name)来标识自身.如此,你能够移除.找到以及替换掉一个附着于节点之上已命名的动作.对先前代码稍作改变,自然就是给动作添加一个key如下: //注意这里在通知spaceship执行runAction动作同时,也给动作命名了! //这样

Python进阶【第一篇】socket

1.socket()模块函数 要使用socket.socket()函数来创建套接字.其语法如下: socket.socket(socket_family,socket_type,protocol=0) socket_family可以是如下参数: socket.AF_INET IPv4(默认) socket.AF_INET6 IPv6 socket.AF_UNIX 只能够用于单一的Unix系统进程间通信 socket_type可以是如下参数: socket.SOCK_STREAM 流式socket

性能测试进阶指南——基础篇一(系统资源的讲解)

本文旨在帮助测试人员对性能测试常用指标做一个简单的讲解,主要包括CPU.内存.磁盘和网络带宽等系统资源,本文仅仅局限于Linux系统,Windows Server系统暂不做考虑. 一.系统资源的分析 Linux下的系统资源主要记录在内核文件/proc中,下面几乎记录了Linux所有的系统信息. 1.CPU 1.1 CPU的文件系统 CPU的基本信息在目录cpuinfo下可以查看,基于不同指令集(ISA)的CPU产生的/proc/cpuinfo文件不一样,基于X86指令集CPU的/proc/cpu

Selenium自动化测试-进阶2-框架篇

前面的文章已经讲述了 Selenium自动化的入门知识,不知道各位看官看懂没有,有不懂的请留言. 接下来,开始讲解 Selenium自动化测试进阶知识. 首先讲解:自动化测试的核心: 利用自动化程序代替手工,实现复杂繁琐的测试. 所以:自动化测试的运行必须是准确的,否则费时费力. 什么样的程序是准确的?? 准确的自动化程是 95%以上Error是真正的错误.否则,自动化测试就是失败的. 那么,要怎么提高自动化测试运行的准确率呢? 把基础学扎实了! 要学好自动化,Java要学好,然后是 JS,当然

日更第13期-2015-4-9-processing教程-API篇-第二讲-lerpColor()、nfp()、

于是隔了十天来更新了.然后今天更新的是Processing的api,其实这算是我学习Processing途中的一种副产品:反正凑够数了, 我今天就拿出来看看.其实只是api文档的话,并没有什么存在的必要性.但如果只是讨论存在的必要性的话,我的博客本身也没有 存在的必要性.比较也没有记载什么高深或者特别有用的东西.我之前写博客的目的只是因为想写,而因为想写而写,自然就会导致 中断,毕竟人是会善变的动物. 那么,我接下来要做的事就是改变. 我打算写些真正有用的文章. 下一篇进入Processing实

webpack进阶之插件篇

一.插件篇 1. 自动补全css3前缀 autoprefixer 官方是这样说的:Parse CSS and add vendor prefixes to CSS rules using values from the Can I Use website,也就是说它是一个自动检测兼容性给各个浏览器加个内核前缀的插件. 举个栗子:最新的弹性盒模型flux实际代码: :fullscreen a { display: flex } 插件自动补充后 a { display: -webkit-box; d

深入理解javascript函数进阶系列第二篇——函数柯里化

前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细介绍函数柯里化(curring) 定义 currying又称部分求值.一个currying的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来.待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值 从