前言
iOS7 beta发布后,大部分开发者和用户的注意力都集中在了iOS 7的全新UI交互设计界面上。一直负责硬件工业设计的Jony Ive首次全面负责苹果的软件和硬件设计工作,自然要把他自己的设计理念完整诠释一番。加上和iOS之父Scott Forstall一直以来的不和,Jony对之前拟物化风格的全面颠覆设计也是必然的结果。
如今iOS7 已经出了beta3版本,在一番喧嚣的或谩骂或惊叹之后,人们逐渐开始接受了iOS 7的新设计风格。其实iOS 7并非是简单的copy windows8和android的flat设计风格,而是将原来令人惊叹的视觉效果从静态的图标和界面悄然转移到与用户的互动之中。或许iOS 7的UI设计并没有大家想的那么糟糕,以Jony的设计功底,相信只要他继续呆在苹果并负责设计工作,一定会让iOS 的界面和交互设计走上一条全新的道路。
对于用户来说,iOS 7的全新界面设计风格就是一切。而对于开发者来说,iOS 7也增加和完善了不少新东西。由于目前iOS 7仍然是beta版本,很多东西都不是最终的,但还是可以从现有发布的工具和API中学到不少。
最近这几天仔细阅读了What’s New in iOS 7,iOS 7 for Developers, What’s New in Xcode等官方文档,并观看了WWDC 2013中有关iOS 7的大部分视频,对于iOS 7有了初步的印象。
从个人了解的情况来看,除了全新升级的Xcode 5开发工具,对于iOS 7开发者来说需要重点关注的三个最大变化是:
1.iOS 7全新的UI 交互设计,以及与之相关的API(UIKit Dynamics), Text Kit
相关的文档有:
iOS Human Interface Guidelines:Designing for iOS 7 (中文版:iOS 人机交互指南之UI设计基础:Designing for iOS 7)
iOS 7 UI Transition Guide: Before You Start (中文版:iOS 7用户界面过渡指南)
WWDC 2013中的相关视频有:
Advanced Techniques with UIKit Dynamics(Session 221),
Advanced Text Layouts and Effects with Text Kit (Session 220),
Best Practices for Great iOS UI Design(Session 225),
Building User Interfaces for iOS 7(Session 201),
Customizing Your App’s Appearance for iOS 7(Session 214),
Custom Transitions Using View Controllers(Session 218)
Exploring Scroll Views on iOS 7 (Session 217),
Getting Started with UIKit Dynamics(Session 206),
Implementing Engaging UI on iOS(Session 226),
Introducing Text Kit(Session 210),
Using Fonts with Text Kit(Session 223),
What’s New in iOS User Interface Design(Session 208),
细心的开发者可以看到在WWDC 2013中与iOS 7的UI设计相关的视频是最多的,也足以看出苹果对此的重视程度。
2、升级后的真正意义上的Multitasking多任务管理
WWDC 2013中的相关视频是:
What’s New with Multitasking (Session 204)
What’s New in Foundation Networking(Session 705)
What’s New in Core Location
What’s New in State Restoration
Improving Performance and Energy Usage
Protecting Secrets with the Keychain
Energy Best Practices
Protecting your User’s Privacy
增强的Multitasking提供了三个非常有用的新特性
(1)Background Fetch(对一些社交类应用非常有用)
(2) Remote Notifications(对阅读聚合类应用非常适合)
(3) Background Transfer Service(对一些社交照片分享类应用很有用),和CFNetworking有关。还可以和自动判断所在地区相结合,比如地图类应用,当用户进入一个新的地理区域后自动下载相关地图。即便用户已经关闭了该应用,仍然有效。
3.游戏开发的新框架和新性能
这部分又包括全新添加的Sprite Kit Framework,全新添加的Game Controller Framework,以及增强的Game Center。
其中Sprite Kit Framework和Game Controller Framework凸显了苹果对于游戏市场的野心。Sprite Kit Framework可以帮助现有的iOS开发人员快速转向游戏开发,而Game Controller Framework则支持真正的硬件游戏控制器(手柄神马的),为苹果推出自己的专用游戏控制器和传说中的iTV奠定了坚实的基础。苹果甚至可以借此彻底抢占家用游戏主机的市场,相信Microsoft, SONY和Nintendo对苹果的野心也是心知肚明的。
相关的苹果官方开发文档有:
Game Controller Programming Guide
Sprite Kit Programming Guide:About Sprite Kit
苹果罕见的为Sprite Kit和Game Controller提供了一个非常完整的多人对战(最多支持4人,支持真正的外接游戏手柄)示例项目以及代码解读文档:
code: Explained Adventure: Introduction
代码下载链接:(Adventure.zip)
WWDC 2013中的相关视频有:
Designing Games with Sprite Kit (Session 503),
Integrating with Game Controllers(Session 501),
Introduction to Sprite Kit(Session 502),
对于一般的iOS 应用开发者来说,重点关注的就是1和2这两大块。而对于游戏开发者来说,特别是2D游戏开发者,不妨了解一下苹果的这个全新游戏开发框架。
现状
对于已经在手机游戏开发市场浴血奋战的开发者来说,目前最常用的几款手机游戏开发引擎工具几乎集中在cocos2d-iphone,cocos2d-x,unity 3d,adobe flash air, html5。其中cocos2d家族(在中国主要是cocos2d-x,在海外cocos2d-iphone用的更多些)开发的2D游戏几乎占据了收入排行榜的80%以上,而unity3d也是当仁不让的3d 手机游戏开发引擎。少数资本雄厚的开发商用unreal等商用引擎,但算不上主流。国外还有少数开发者用corona, game salad等引擎或工具,但充其量也只是占据了少数的业余爱好者市场,更谈不上主流。
cocos2d从2009年发布cocos2d-iphone到现在不过4年的时间,但却伴随着iOS和智能手机市场的崛起而迅速壮大。2011年才发布的cocos2d-x更是在短短两年时间内就成了2d手机游戏开发的首选引擎工具。
或许是苹果在为即将发布的iTV和家用游戏机做最后的准备,这次iOS 7的变化中,全新的Sprite Kit Framework和Game Controller Framework可谓是提供给游戏开发者的屠龙宝刀。
那么,同为2d游戏开发引擎工具的cocos2d和Sprite Kit,可谓是倚天屠龙,那么究竟那一柄利器会让开发者更为高效的开发游戏呢?iOS 7 之后,究竟还有无必要继续使用cocos2d?
在接下来的内容中,本文将对Sprite Kit和cocos2d做一个简单的对比,并提出自己的一些看法。
不过,在继续之前,强烈推荐对Sprite Kit感兴趣的开发者看看WWDC 2013中的相关视频,以及官方的开发指南和示例项目代码。
Sprite Kit 和cocos2d开发对比
这里假定看此文的朋友对cocos2d已经有一定的了解,当然,即便不懂cocos2d也不会看不懂,只是对于两者的对比可能缺少感性的认识。这里以cocos2d-iphone为例,考虑到cocos2d-x的主要特性都是从cocos2d-iphone移植的,就不另作特别说明了。
1.所支持的主要特性对比
作为一款被市场普遍接受的2d游戏开发引擎,cocos2d支持场景管理(scene),场景切换(transitions),精灵和精灵表单,动作,动画和特效,菜单和菜单按钮,内置支持box2d(使用c++语言)和chipmunk(使用c语言)物理引擎,粒子特效,文本渲染,纹理图集,瓷砖地图,视差滚动,音效,暂停/恢复,快速纹理,opengl es 1.1(cocos2d 1.x)和opengl es 2.0(cocos2d 2.x),等等。
而作为苹果官方内置的游戏开发框架,Sprite Kit几乎支持cocos2d的所有主要特性,在物理引擎方面更是无需借助外力。
但就所支持的特性来说,两者不分高下。
在仔细看了相关的文档和视频后,我甚至觉得苹果是直接把cocos2d-iphone引擎维护团队的某位牛人挖走了,然后改头换面弄了一个Sprite Kit。难怪cocos2d-iphone的主要作者Riq先生在观看了Sprite Kit的演示视频后油然而生一种“既生瑜何生亮”的感叹。
2.安装和配置对比
cocos2d 的安装配置其实很简单,只需要在Terminal中切换到所在的目录,然后输入一个命令行即可完成安装。然后在Xcode中创建新项目选择对应的cocos2d或cocos2d-x模板即可。
但相比Sprite Kit来说,要借助Terminal和命令行命令的安装方式还是稍逊风骚。Sprite Kit作为内置的游戏开发框架无需安装。而对于新的游戏项目,开发者只需要在Xcode 5中选择SpriteKit Game模板即可。需要注意的是,SpriteKit Game模板默认是采用storyboard的。
3.帮助文档对比
cocos2d的帮助文档可以借助doxygen整合到Xcode中,但通常我个人偏好使用Dash来查找所需API的帮助文档。
Sprite Kit在这方面又赢了,因为是内置的framework,可以直接在Xcode的documentation中查看帮助文档,而且Xcode 5的帮助文档非常便于使用,非常人性化。
4.应用启动流程对比
在使用cocos2d开发的游戏中,启动流程如下:
main.m --->AppDelegate的didFinishLaunchingWithOptions方法--->IntroLayer的onEnter方法--->特定游戏的首界面或加载界面
在使用Sprite Kit开发的游戏中,启动流程如下:
main.m---> XXXAppDelegate(XXX为项目名称)--->XXXViewController的viewDidLoad方法--->特定游戏的首界面
5.核心类对比
在进行对比之前,先对cocos2d的核心类做一下简单的回顾,这部分也可以完全跳过。
cocos2d的核心类包括CCNode,CCScene,CCLayer三个没有具体视觉呈现的抽象类,以及CCTexture纹理类,CCSprite精灵类,CCLabel文本标签,CCMenu菜单等。
(1)CCNode
CCNode是Cocos2d中最为重要的类,也可以说是整个cocos2d的基础,它是所有节点的基类,它是一个抽象类,没有视觉表现,定义了所有节点都通用的属性和方法。
在Cocos2D中,所有要绘制到屏幕的对象,或是自身包含要绘制到屏幕中的对象,都属于CCNode类。最重要的几个CCNode类分别是CCScene、CCLayer、CCSprite、CCMenu。CCNode的主要作用:
a.包含其他的CCNode节点(addChild、getChildByTag、removeChild等方法)
b.通过定时器预定消息(schedule、unschedule等方法)
c.执行动作(runAction、stopAction等方法)
CCNode有非常多有用的属性,比如锚点(anchorPoint),camera(游戏视角),children(子节点数组),contentSize(节点大小),position(位置),rotation(旋转角度),scale(缩放比例,又分为scale,scaleX,scaleY),skew(变形角度,分为skewX和skewY),tag(标识值),userData(自定义的数据指针对象),visible(是否可见),zOrder(视觉显示的z顺序值),等等。有些属性不太常用就不在这里一一列出,大家可以参考官方文档或dash里面的帮助文档。
CCNode主要实现三大类方法,分别是对子节点的处理,使用定时器预定消息,以及执行动作。
其中对子节点的处理又包括添加、获取和删除子节点。
其中执行动作的方法包括运行某个特定的动作,停止动作,停止某个特定动作,停止动作列表中的某个特定动作,获取动作列表中的某个特定动作,获取动作的数量等。
其中预定消息主要是update方法,可以设置特定的时间间隔,或默认按每帧来调用。
除了以上方法外,CCNode还支持坐标转换,视图-矩阵转换,初始化节点等多个方法,可谓威力无比。
(2)CCScene
CCScene是CCNode的子类,和CCNode一样,也是一个抽象类。事实上,CCScene和CCNode几乎完全相同,唯一差异就在于CCScene的锚点位置默认在屏幕中心。如果打开模板中CCScene.h文件,会发现其中只说明CCScene继承自CCNode,并没有任何其他内容。
当前版本的Cocos2D-iPhone中,CCScene类基本上没有附加任何逻辑机制和特殊功能。通常建议将CCScene作为所有其他节点的父节点,看作CCLayer(层)对象的一个容器。
需要说明的是,通常CCScene的子节点都直接继承自CCLayer。CCLayer包含各个游戏对象。因为大多数情况下场景对象本身不包含任何游戏相关的代码,而且很少被子类化,所以它一般在CCLayer对象里通过+(id)scene静态方法来创建。
CCScene场景类支持多种场景切换效果。
(3)CCLayer
一个CCLayer是屏幕上可绘制的区域,可以是半透明的,这样就可以看到CCScene下面的其他层。在游戏编程的过程中,开发者大部分时间都需要跟层打交道。
CCLayer直接继承自CCNode,作为精灵节点和其他节点的容器,同时可以接收触摸输入和加速计输入的信息,前提是上述接收功能已被启用。
CCLayer类的作用主要是三个:作为其它子节点的容器和组织者,接收触摸事件,接收加速计事件。CCLayerColor是一个透明的、可以按照RGB 设置填充颜色的层,是实现CCRGBAProtocol协议的CCLayer子类,继承了CCNode所有属性和方法,同时还可以接收触摸事件和加速计事件。它的特有属性包括color(ccColor3B类型的色彩),opacity(Glubyte类型的透明度),blendFunc(ccBlendFunc)类型的混合模式。
(4)CCMenu菜单
CCMenu继承自CCLayer,是一个菜单管理选择画面层,该画面以Menu对象为集合类,由MenuItem类实例组成各种按钮。CCMenu类提供的方法主要用来按横向、竖向或者多行列排序展示MenueItem的类实例。
(5)CCTexture纹理
在游戏运行中,所有图像文件(PNG、PVR)都被加载成GPU可以理解的OpenGL ES纹理,而精灵则对应着这些纹理图。Cocos2D内置一个纹理缓存管理器(CCTextureCache)来保持这些纹理图。
在cocos2d中,和纹理相关的类包括CCTexture2D,CCTextureCache和CCTextureAtlas。
在Cocos2D中,使用CCTexture2D(纹理)从图片、文本或源数据中创建OpenGL 2D纹理,所创建的纹理对象使用2的乘方来填充。
CCTextureCache(纹理缓存)作为单例使用,用于加载和管理纹理。一旦纹理加载完成,下次使用时可使用它返回之前加载的纹理,从而减少对GPU和CPU内存的占用。
使用CCTextureAtlas(纹理图集)来实现纹理图集。纹理图文件可以是PVRTC、PNG或任何Texture2D所支持的文件类型。可以对纹理图集的矩形进行实时的更新,添加,删除或重排序。
(6)CCSprite精灵
CCSprite是Cocos2D游戏开发中最常用的类,也是cocos2d引擎的灵魂。
在游戏开发中,经常会遇到精灵(sprite)这个术语。精灵是一个图像,可以在屏幕上独立地移动。一个精灵可能是玩家角色、敌人,或者是大的背景图像。一般情况下,精灵来自于开发者所准备的PNG或PVRTC图像。一旦图像载入内存,精灵将被转换成纹理图,从而被iPhone GPU用于在屏幕上渲染。
生成精灵最简单的方法是把图片文件加载进CCTexture2D纹理,然后将它赋给精灵。精灵可以接受其他精灵作为子节点。CCSprite默认锚点位置是(0.5,0.5),也就是节点的几何中心。
如果一个精灵的父类是标准CCNode节点,那么它和其他CCNode的属性和方法没有太大区别。如果一个精灵的父类或任何一个祖先类是CCSpriteBatchNode,那么具备的特性包括:更快地纹理渲染、不支持Camera、不支持GridBase、不能单独设置Alias/Antialias属性、不能单独设置混合模式、不支持视差滚动。
(7)CCSpriteBatchNode精灵表单和CCSpriteFrame精灵帧
如果仔细看看CCSprite相关代码(CCSprite.h文件),会发现在游戏的每一帧都会调用-(void)draw方法。在draw方法中,每次在屏幕中绘制一个精灵时都会调用真实的OpenGL ES命令(gl为前缀的方法,详见gl.h)。对于每个精灵,OpenGL ES都需要将纹理图绑定在这个CCSprite上,然后将其绘制在屏幕上(称为渲染)。
在屏幕上真实显示图像的像素前,还有一件事要做:iOS提供的OpenGL ES驱动将把OpenGL ES的命令转换成GPU可以理解的硬件编码,从而让GPU显示图像。作为一个游戏开发者,无需了解更多驱动细节,只需明白一点,每次调用OpenGL ES的命令都将耗费OpenGL ES驱动的CPU时钟。如果尽可能地减少OpenGL ES的调用,游戏的运行将更为顺畅。
要实现这一点,就需要让OpenGL ES一次性处理所有纹理图,而使用CCSpriteBatchNode和纹理图集就能实现这一目的。
在使用精灵表单时,CCSpriteBatchNode、CCSpriteFrame和CCSpriteFrameCache常常配合使用。
(8)CCDirector导演
CCDirector(导演类)是Cocos2D游戏引擎的核心。CCDirector是一个单例,它保存Cocos2D的全局配置设定,同时管理Cocos2D场景。主要作用如下:
a.访问和改变场景;
b.访问Cocos2D的配置细节;
c.访问视图(OpenGL、UIView、UIWindow);
d.暂停、恢复和结束游戏;
e.在UIKit和OpenGL之间转换坐标。
(9)CCAction动作
如果说CCSprite是cocos2d的灵魂,那么CCAction则是cocos2d绚丽多彩的外表。
任何一个游戏中的角色都不会在原地一动不动,使用动作可以让玩家更好地产生游戏中的参与感,并沉浸其中。
可以把节点动作想象成给所有CCNode节点对象下达的命令。这些动作可以修改节点对象的各种属性,如position(位置)、rotation(旋转)、scale(比例)等。如果这些属性是经过一段时间之后修改的,属于CCActionInterval(区间动作),否则属于CCActionInstant(瞬时动作)。
cocos2d默认提供了多种不同的基本动作,同时开发者还可以使用组合动作,ease动作,延迟动作,方法回调动作,块语句调用动作,反转动作,特殊动作来让cococs2d的游戏世界丰富多彩。
此外,cocos2d还提供了20多种特效,特效也是动作,只是其原理是利用cocos2d的网格来生成动作。特效会调整节点的网格属性。网格是节点的一种新属性,使用网格可以将节点划分为更小的方块或瓦片,通过移动组成每个方块的顶点调整节点的属性。
在cocos2d中还提供了用于创建动画的另一种特殊动作,CCAnimate、CCAnimation和CCAnimationCache这三个类。在Cocos2D中实现动画其实很简单,只需从精灵表单(CCSpriteBatchNode)中获取一系列图片,按照特定的顺序排列,最后在精灵对象上执行特定的动作。
(10)CCLabel文本渲染系统
cocos2d中提供了三种用于文本渲染的类,CCLabelTTF,CCLabelAtlas,CCLabelBMFont.
在使用Cocos2D开发的项目中,经常用CCLabelTTF类显示一些静态的标签和文本。CCLabelTTF类继承自CCSprite,主要用于渲染文本标签。使用CCLabelTTF类可以用很少的代码将文本嵌入到游戏之中。
虽然使用CCLabelTTF显示静态标签文本比较方便,但其渲染速度相对较慢,且通常用于显示纯文本。为了提高文本渲染速度,同时为在项目中显示文本提供更大的灵活性,Cocos2D提供了CCLabelTTF的替代类CCLabelAtlas。
CCLabelBMFont类支持不同宽度的字符,并且有很多第三方的编辑器支持,比CCLabelAtlas更灵活。
(11)CCTileMap瓷砖地图(瓦片地图)
瓷砖地图(Tile Map)是图形界面程序设计和游戏设计领域中常用的技术,也有人将其翻译成“瓦片地图”。其原理是用小的瓷砖(Tile)拼接出一张大的地图。这样做的好处很多,最明显的当然就是节省内存,大大提高OpenGL的渲染绘图性能。很多游戏开发引擎都内置了对瓷砖地图的支持,Cocos2D当然也不会例外。
瓷砖地图其实是二维数组,数组中的每个元素都包含地图中的某个特定区域信息。此类信息包括该区域中所显示的图像、瓷砖的碰撞属性等。
对于创建游戏中的大型关卡(特别是RPG角色扮演类游戏)瓷砖地图非常有用。即使游戏不是很大,如果为每个关卡创建不同的滚动背景,也需要用到瓷砖地图。
(12)CCParticleSystem(粒子系统类)
粒子系统是计算机图形学中用来模拟一些特定效果的技术,特别是一些模糊的现象。这些现象用传统的渲染技术难以实现。使用粒子效果可以模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或发光轨迹这样的模糊而又抽象的视觉效果。
在Cocos2D中提供了几个与创建和编辑粒子系统相关的类。了解并掌握了这些类之后,就可以在游戏中轻松的创建和编译粒子系统。其中主要是CCParticleSystem、CCParticleSystemQuad和CCParticleBatchNode类。此外cocos2d还内置了多种粒子特效。
以上概念对于cocos2d游戏开发者来说应该是非常熟悉的了,这里再次归纳一下是为了便于和Sprite Kit进行全面的对比。
实际上,以上的核心类就是一款cocos2d游戏的核心组织元素。
有了这十一大核心类,可以充分发挥开发者的创意和想象力,开发出令人唏嘘不已的游戏体验。事实上,cocos2d在过去4年内的巨大成功也要归功于这十一种利器。
那么,对比已经相对比较完善的cocos2d,Sprite Kit又靠什么来取胜呢?
接下来让我们一起来了解下Sprite Kit。
根据官方的文档和视频,Sprite Kit由三大部分组成,分别是Scene(场景),Actions(动作)和Physics(物理)。Scene当然是游戏场景及其中的角色,背景等;Actions则负责处理游戏角色的动作动画特效音效等,Physics则专门负责物理模拟。仅从这一点来看,Sprite Kit和cocos2d的本质是相似的。
当我们在Xcode中查看SpriteKit.framework的Headers时,会发现其中的类并不多,只有21个.h文件,打开SpriteKit.h就可以看到其中的代码如下:
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
#import
再加上一个SpriteKitBase.h和SpriteKit.h,一共只有21个.h文件。而cocos2d中有多少个.h文件呢?我大概数了下,至少超过250个~
这个该如何比较呢?既可以说cocos2d功能全面,也可以说Sprite Kit设计简洁,秉承了苹果一贯的风格。
好了,现在可以来看看Sprite Kit的核心类有哪些:
(1)SKNode vs CCNode
SKNode对于Sprite Kit的重要性如同CCNode对于cocos2d的意义一样。cocos2d的游戏场景可以用场景节点图的形式来展现,而节点同样是Sprite Kit游戏场景的根基。
Sprite Kit游戏中的所有视觉元素均使用SKNode的子类来绘制。
SKNode的几大子类包括:
SKSpriteNode(对应CCSprite,用于绘制精灵纹理);
SKVideoNode(在cocos2d中无对应类,用于播放视频);
SKLabelNode(对应CCLabel,用于渲染文本);
SKShapeNode(在cocos2d中无对应类,用于渲染基于Core Graphics路径的形状);
SKEmitterNode(对应CCParticleSystem,用于创建和渲染粒子系统);
SKCropNode(无对应类,用于使用遮罩来裁剪子节点);
SKEffectNode(无对应类,用于在子节点上使用Core Image滤镜)。
类似cocos2d,SKNode也是用节点树的形式来组织的,这一点和iOS的视图层级也有相似之处。通常情况下,在一个游戏场景中,SKScene(场景节点)将作为根节点存在,而其它的内容节点都是其子节点。场景节点将负责运行一个动画循环,从而来处理其它子节点的动作,模拟物理世界,并将节点数中的内容渲染到屏幕上。
节点树中的每一个节点都为其子节点提供了一套坐标体系。当我们将某个子节点添加到节点树中时,可以通过设置其position和zPosition属性将其放置在父节点的坐标体系中。可以通过xScale,yScale和zRotation等属性来缩放和旋转节点。当某个节点的坐标体系被缩放或旋转时,其自身内容和所有子节点的内容也会发生同样的变化。
类似CCNode,SKNode自身是个抽象类,没有具体的视觉呈现。但SKNode的子类则可以分别用于绘制不同的视觉内容。
SKNode的frame属性可以获得节点的视觉内容的边框,通过调用calculateAccumulatedFrame方法可以获取包含该节点和其所有子节点的边框。
节点树上的所有节点都可以运行动作,从而可以产生动画和动作效果,添加或删除节点,播放音效或其它特定任务。在Sprite Kit中,动作(action)的重要性尤胜于cocos2d。
SKNode还有其它一些属性,比如设置透明度的alpha属性,设置是否显示的hidden属性等。这里就不一一列举了,开发者可以参考苹果官方文档了解更详细的信息。
接下来说说SKNode和CCNode不太一样的地方。在cocos2d中,有专门的CCLayer类用于接收触摸事件或加速计事件,从而处理用户交互。
但在Sprite Kit中并不存在一个专门的Layer类,所有的SKNode节点都可以对屏幕上的用户交互做出直接响应,这一点相对cocos2d实在是个大大的改进。我们可以转换坐标体系,根据触摸测试(点击测试)来判断用户的触摸点在哪个节点上。同时我们还可以对节点树中的节点进行交叉测试,从而来判断它们的物理区域是否重叠。当然,cococs2d中也是完全可以实现这一点的,只是多了一个中间步骤而已。
如果我们来仔细看看SKNode.h的源代码,会发现SKNode继承自UIResponder,并遵循NSCopying和NSCoding协议。而查看CCNode.h的源代码,会发现CCNode只是简单的继承自NSObject,不像SKNode这样一出生就肩负重任。
正因为SKNode继承自UIResponder,所以所有的SKNode节点其实都可以直接对用户交互作为直接响应,比起cocos2d利用CCLayer来处理交互的方式要直接一些。
另外,因为SKNode要遵循NSCopying和NSCoding协议,所以在自行创建SKNode的子类时,如果要给该类添加要archive的属性,就必须实现NSCoding协议。具体可以参考(xcdoc://ios/documentation/Cocoa/Conceptual/Archiving/Archiving.html)
(2)SKView vs CCGLView/CCDirector
SKView继承自UIView(如果是Mac应用则继承自NSView,不过这里默认都是iOS应用,就不再赘述了)。
我们都知道在cocos2d中使用CCGLView,而CCGLView本身又继承自UIView,所以殊途同归。当然,cocos2d中的CCGLView是将OpenGL场景渲染进EAGL中。至于具体的细节,如果不是引擎的开发者,或者对OpenGL不感冒,也没必要深入研究。
Sprite Kit中的SKView类比cocos2d中的CCGLView要简单的多,它的主要作用就是作为视图容器来显示Sprite Kit的内容。而这个内容则是由SKScene提供。
SKView的很多作用类似于cocos2d中的CCDirector导演类。
通过调用SKView的prensentScene:方法就可以在视图中呈现游戏场景的内容。
通过调用presentScene:transition:方法则会以某种特定的场景切换效果从当前场景切换到新的场景。
当游戏场景被显示后,将会在场景模拟(场景中的内容动画)和内容渲染之间来回切换状态。我们可以通过设置该类的paused属性来暂停游戏场景。
此外,SKView还可以使用textureFromNode方法从场景内容中获取纹理图,使用Core Animation来同步渲染精灵。
SKView可以设置是否显示游戏的相关测试信息(showsFPS-游戏帧速,showsDrawCount-绘制数量,showsNodeCount-节点数量)。
SKView还提供了转换视图和游戏场景坐标的方法。
当然,如果我们对比SKView和CCDirector的属性和方法,会发现CCDirector所提供的功能更全面更强大,但也有些过于追求大而全的感觉。而SKView一如苹果一贯的产品设计风格,只提供最核心的功能,对次要功能则宁可弃之不用。好处是因为方法和属性较少,很容易掌握,而不好的地方当然就是功能没有CCDirector那么全面强大了。
在XXXViewController.m的viewDidLoad方法中,配置SKView的代码非常简洁明了:
而紧接着就是创建和配置游戏场景的代码
(3)SKScene vs CCScene
与cocos2d中的CCScene类似,Sprite Kit中的SKScene更多起到一个容器的作用,但比起CCScene,SKScene的任务更多一些。
首先,SKScene是一个抽象类,因此在实际的项目中必须创建该类的子类。游戏的主要内容和逻辑都会在子类中运行。
SKScene的任务包括:
a.调用update:方法
b.在其子节点上执行动作;
c.调用didEvaluateActions方法;
d.对场景中的物体执行物理模拟计算;
d.调用didSimulatePhysics方法。
说到这里,就不得不说一下Sprite Kit游戏的循环。
进入游戏后,由SKView负责渲染游戏场景,在游戏的每一帧,首先在update:方法里面更新游戏中角色的信息,然后由SKScene评估并执行这些动作,接下来调用didEvaluateActions方法,再然后由SKScene模拟物理世界的变化,最后再调用didSimulatePhysics方法。然后再次由SKView渲染游戏场景,重新开始下一次的循环。
与cocos2d相比,这样的游戏循环逻辑更为严密清晰,初学者可能也更容易理解。
(4)SKSpriteNode/SKSprite vs CCSprite
SKSpriteNode的重要性从它的名字就可以看出来,没有Sprite,哪来的Sprite Kit?
不过与cocos2d相比,SKSpriteNode的作用更加纯粹,它只是用来绘制精灵纹理。而在cocos2d中,连CCLabel文本也是CCSprite的子类。
比cocos2d方便的是,Sprite Kit中提供了多种与SKSpriteNode具备同等地位的节点。
比如专门用于播放视频的SKVideoNode,cocos2d里面没有类似的类;
专门用于渲染文本的SKLabelNode,在cocos2d中使用CCSprite的子类CCLabelTTF等;
用于根据Core Graphics 路径来渲染抽象形状的SKShapeNode,想来用于制作涂鸦类的游戏自然是绝佳的,可惜cocos2d中貌似没有类似的类;
用于创建粒子效果的SKEmitterNode,在Cocos2d中有与之对应的类CCParticleSystem:
使用遮罩来裁剪子节点的SKCropNode,在cocos2d中貌似没有对应的类;
在子节点上使用Core Image 滤镜效果的SKEffectNode,在cocos2d中貌似没有对应的类。
因为这几个类在Sprite Kit中与SKSpriteNode处于同一级别,这里就一并比较了,后面不再重复。
(5)SKTexture vs CCTexture2D
SKTexture的作用与cocos2d中的CCTexture2D是类似的,用于创建可以被Sprite Kit对象(通常是SKSpriteNode对象)重用的纹理图像。使用纹理可以让Sprite Kit对精灵的渲染更加高效。
我们可以从不同的源中初始化纹理,比如bundle中的图片文件,core image filters, Quartz 2D图形,甚至是原始像素数据。在Sprite Kit中,可以使用SKTextureAtlas来创建纹理图集。
需要注意的是,在cocos2d中有CCSpriteBatchNode精灵表单,但Sprite Kit中只有SKTextureAtlas,两者的作用是类似的,都是使用单次OpenGL ES命令调用替代重复的OpenGL ES命令。
(6) SKAction vs CCAction
SKAction在Sprite Kit中的作用非常重要,和CCAction类似,同样用于创建节点动作。合理使用动作(actions)可以让游戏世界更加丰富多彩,灵活多变,充满吸引力。
使用SKAction可以更改节点的多个属性,如位置,旋转或缩放等。部分动作只能用于SKSpriteNode,比如更改精灵的色彩或纹理属性。
此外,Sprite Kit中允许创建三种复杂的动作,可以将其它动作作为子动作,分别是序列动作,组合动作和重复动作。在Sprite Kit中,序列动作,组合动作和重复动作都是可以嵌套的。
需要注意的是,开发者不能直接创建SKAction的子类,而是直接对目标对象调用方法或执行块语句。
我们都知道cocos2d中提供了多个CCAction的子类,但在Sprite Kit中只有一个SKAction,且不允许创建其子类。
总的来说,从创建动作的角度来看,SKAction和CCAction可以达到完全相同的效果。
(7)SKPhysicsBody/SKPhysicsContact/SKPhysicsJoint/SKPhysicsWorld vs Box2d/chipmunk
大家都知道,cocos2d并没有自己的物理引擎,而是内置了box2d或chipmunk两个第三方物理引擎。而box2d采用c++语言开发,chipmunk采用c语言开发,对iOS开发者来说多少是个麻烦事。
从这个角度来看,Sprite Kit可谓直接胜出。SKPhysics相关类非常简洁明了,原生Objective-C,无论从配置到使用都很简单。
关于这部分,可以参考苹果官方的Adventure游戏,这里也不再多说。
比较到这里,基本上已经涵盖了Sprite Kit绝大多数的核心类。感觉Sprite Kit的设计非常清晰简洁,而cocos2d由于属于开源项目,从结构上来说稍显复杂,但因为众多开发者的反馈和贡献,功能却比Sprite Kit要丰富很多。
(8)AV Foundation vs CocosDenshion
在cocos2d中使用cocosDenshion来播放游戏的音效和背景音乐,只需一行代码就可以搞定一切。
在Sprite Kit中需要借助AV Foundation的帮助,但功能显然要强大很多。
6.工具对比
用过cocos2d开发游戏的朋友都知道有不少第三方的开发工具对其进行支持,这里也简单对比一下。
(1)创建纹理图集
在cocos2d中常用Zwoptex或者Texture Packer,非常方便,特别是Texture Packer,可惜是付费的。
但如果用了Sprite Kit之后,就会发现在Xcode 5中创建纹理图集更方便,无需任何第三方工具。具体的操作可以参考官方视频。
(2) 创建瓦片(瓷砖)地图
在cocos2d中通常使用Tiled Map或其它第三方工具。
在Sprite Kit中貌似没有内置的创建工具。
(3)创建字体
在cocos2d中可以使用Hiero等第三方工具。
使用Sprite Kit开发则可以直接利用iOS 7中最新的Text Kit,显然更为强大。
(4)创建粒子效果
在cocos2d中可以使用Particle Designer等第三方工具,很直观,很强大。
在Sprite Kit中则可以直接利用Xcode 5内置的粒子编辑器,同样非常强大。
(5)创建游戏界面
在cocos2d中可以使用CocosBuilder等第三方工具,目前仍然在完善中。
在Sprite Kit中则可以直接借助Xcode 5中的Interface Builder,很直接。
显然,如果使用cocos2d需要大量借助第三方的开发工具,而使用Sprite Kit则可以直接利用Xcode 5和iOS 7的诸多新特性,无需学习第三方工具。
Sprite Kit和cocos2d对比小结
相信在看了以上的比较之后(再次建议看看WWDC 2013官方视频和相关的官方文档),大家对Sprite Kit已经有了初步的认识。
那么,究竟Sprite Kit能否替代cocos2d成为2d手机游戏开发的首选工具呢?
在作出自己的结论之间,先用表格的方式来做一个小小的总结。
整理完这个表格之后,下面就是我个人的结论:
a.Sprite Kit作为iOS 7 内置的游戏开发工具,短期内不太可能替代cocos2d-x,但很有可能完全替代cocos2d-iphone。
b.如果要支持跨平台开发,那么2D游戏引擎还是首选cocos2d-x,没有其它。按照苹果的风格,Sprite Kit这么霸气的工具是不可能支持Android游戏开发的。
c.初学手机游戏开发的,如果只想搞iOS游戏开发,那么可以直接学Sprite Kit,不必从cocos2d-iphone学起。
d..现有的开发者,如果只专注iOS游戏,那么完全没必要转到Sprite Kit。cocos2d的功能足够强大。
e.Sprite Kit的成功与否取决于iOS平台能否继续发力。