SpriteKit学习笔记(六)关于SpriteKit与cocos2d

来源:互联网 发布:飞天特效软件下载 编辑:程序博客网 时间:2024/05/22 14:53

http://blog.csdn.net/kobbbb/article/details/9446935


 

SpriteKit学习笔记(六)关于SpriteKit与cocos2d

分类: iOS Sprite Kit 1279人阅读 评论(0) 收藏 举报
SpriteKitcocos2d

今早看了一篇文章,关于SpriteKit与cocos2d的对比的,写得很不错,里面谈到的关于SpriteKit的东西也说得很好,大概第总结了SpriteKit,有很多是我之前的文章中没提到过的,现在赶紧把它记下来。

之前没说过的一点就是苹果最大的特点之一,简洁,整个SpriteKit也就21个头文件,但基本该有的功能都有,而且做得很完善,原文把SpriteKit与cocos2d两个引擎的核心类做了一下对比,就主要把这部分贴一下吧

(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协议。
 
(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的代码非常简洁明了:
  1. // Configure the view. 
  2.   SKView * skView = (SKView *)self.view; 
  3.   skView.showsFPS = YES; 
  4.   skView.showsNodeCount = YES; 
 
而紧接着就是创建和配置游戏场景的代码
 
(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的帮助,但功能显然要强大很多。

看完以上这些比较,着重在于SpriteKit的部分,对SpriteKit会有更深刻的理解
至于工具方面,Xcode几乎可以完成SpriteKit需要的所有东西,粒子系统以及texture atlas图集等
更重要的一点,iOS其他的一些Api也能引用到SpriteKit中去,比如用TextKit做字体等,确实很强大
原文地址:初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比

0 0