初探使用iOS 7 Sprite Kit與Cocos2d開發遊戲的對比

前言



       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(https://developer.apple.com/wwdc/videos/)中有關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(https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/MobileHIG/index.html#//apple_ref/doc/uid/TP40006556)


iOS 7 UI Transition Guide: Before You Start(https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/TransitionGuide/index.html#//apple_ref/doc/uid/TP40013174 )



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有關。還可以和自動判斷所在地區相結合,比如地圖類應用,當用戶進入一個新的地理區域後自動下載相關地圖。即便用戶已經關閉了該應用,仍然有效。


  1. 遊戲開發的新框架和新性能


這部分又包括全新添加的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(https://developer.apple.com/library/prerelease/ios/documentation/ServicesDiscovery/Conceptual/GameControllerPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40013276)

Sprite Kit Programming Guide:About Sprite Kit(https://developer.apple.com/library/prerelease/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Introduction/Introduction.html)


蘋果罕見的爲Sprite Kit和Game Controller提供了一個非常完整的多人對戰(最多支持4人,支持真正的外接遊戲手柄)示例項目以及代碼解讀文檔:

code: Explained Adventure: Introduction(https://developer.apple.com/library/prerelease/ios/documentation/GraphicsAnimation/Conceptual/CodeExplainedAdventure/AdventureArchitecture/AdventureArchitecture.html#//apple_ref/doc/uid/TP40013140)

代碼下載鏈接:(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的主要作用:

.包含其他的CCNode節點(addChild、getChildByTag、removeChild等方法)

.通過定時器預定消息(schedule、unschedule等方法)

.執行動作(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還支持座標轉換,視圖-矩陣轉換,初始化節點等多個方法,可謂威力無比。


  1. 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的類實例。

(4)CCTexture紋理


在遊戲運行中,所有圖像文件(PNG、PVR)都被加載成GPU可以理解的OpenGL ES紋理,而精靈則對應着這些紋理圖。Cocos2D內置一個紋理緩存管理器(CCTextureCache)來保持這些紋理圖。

在cocos2d中,和紋理相關的類包括CCTexture2D,CCTextureCache和CCTextureAtlas。

在Cocos2D中,使用CCTexture2D(紋理)從圖片、文本或源數據中創建OpenGL 2D紋理,所創建的紋理對象使用2的乘方來填充。

CCTextureCache(紋理緩存)作爲單例使用,用於加載和管理紋理。一旦紋理加載完成,下次使用時可使用它返回之前加載的紋理,從而減少對GPU和CPU內存的佔用。

使用CCTextureAtlas(紋理圖集)來實現紋理圖集。紋理圖文件可以是PVRTC、PNG或任何Texture2D所支持的文件類型。可以對紋理圖集的矩形進行實時的更新,添加,刪除或重排序。


(5)CCSprite精靈

CCSprite是Cocos2D遊戲開發中最常用的類,也是cocos2d引擎的靈魂。


在遊戲開發中,經常會遇到精靈(sprite)這個術語。精靈是一個圖像,可以在屏幕上獨立地移動。一個精靈可能是玩家角色、敵人,或者是大的背景圖像。一般情況下,精靈來自於開發者所準備的PNG或PVRTC圖像。一旦圖像載入內存,精靈將被轉換成紋理圖,從而被iPhone GPU用於在屏幕上渲染。

生成精靈最簡單的方法是把圖片文件加載進CCTexture2D紋理,然後將它賦給精靈。精靈可以接受其他精靈作爲子節點。CCSprite默認錨點位置是(0.5,0.5),也就是節點的幾何中心。

如果一個精靈的父類是標準CCNode節點,那麼它和其他CCNode的屬性和方法沒有太大區別。如果一個精靈的父類或任何一個祖先類是CCSpriteBatchNode,那麼具備的特性包括:更快地紋理渲染、不支持Camera、不支持GridBase、不能單獨設置Alias/Antialias屬性、不能單獨設置混合模式、不支持視差滾動。


(6)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常常配合使用。


(7)CCDirector導演

CCDirector(導演類)是Cocos2D遊戲引擎的核心。

CCDirector是一個單例,它保存Cocos2D的全局配置設定,同時管理Cocos2D場景。主要作用如下:

訪問和改變場景;

訪問Cocos2D的配置細節;

訪問視圖(OpenGL、UIView、UIWindow);

暫停、恢復和結束遊戲;

在UIKit和OpenGL之間轉換座標。


(8)CCAction動作


如果說CCSprite是cocos2d的靈魂,那麼CCAction則是cocos2d絢麗多彩的外表。

任何一個遊戲中的角色都不會在原地一動不動,使用動作可以讓玩家更好地產生遊戲中的參與感,並沉浸其中。可以把節點動作想象成給所有CCNode節點對象下達的命令。這些動作可以修改節點對象的各種屬性,如position(位置)、rotation(旋轉)、scale(比例)等。如果這些屬性是經過一段時間之後修改的,屬於CCActionInterval(區間動作),否則屬於CCActionInstant(瞬時動作)。

cocos2d默認提供了多種不同的基本動作,同時開發者還可以使用組合動作,ease動作,延遲動作,方法回調動作,塊語句調用動作,反轉動作,特殊動作來讓cococs2d的遊戲世界豐富多彩。此外,cocos2d還提供了20多種特效,特效也是動作,只是其原理是利用cocos2d的網格來生成動作。特效會調整節點的網格屬性。網格是節點的一種新屬性,使用網格可以將節點劃分爲更小的方塊或瓦片,通過移動組成每個方塊的頂點調整節點的屬性。

在cocos2d中還提供了用於創建動畫的另一種特殊動作,CCAnimate、CCAnimation和CCAnimationCache這三個類。在Cocos2D中實現動畫其實很簡單,只需從精靈表單(CCSpriteBatchNode)中獲取一系列圖片,按照特定的順序排列,最後在精靈對象上執行特定的動作。


  1. CCLabel文本渲染系統


cocos2d中提供了三種用於文本渲染的類,CCLabelTTF,CCLabelAtlas,CCLabelBMFont.

在使用Cocos2D開發的項目中,經常用CCLabelTTF類顯示一些靜態的標籤和文本。CCLabelTTF類繼承自CCSprite,主要用於渲染文本標籤。使用CCLabelTTF類可以用很少的代碼將文本嵌入到遊戲之中。

雖然使用CCLabelTTF顯示靜態標籤文本比較方便,但其渲染速度相對較慢,且通常用於顯示純文本。爲了提高文本渲染速度,同時爲在項目中顯示文本提供更大的靈活性,Cocos2D提供了CCLabelTTF的替代類CCLabelAtlas。

CCLabelBMFont類支持不同寬度的字符,並且有很多第三方的編輯器支持,比CCLabelAtlas更靈活。


(10)CCTileMap瓷磚地圖(瓦片地圖)


瓷磚地圖(Tile Map)是圖形界面程序設計和遊戲設計領域中常用的技術,也有人將其翻譯成“瓦片地圖”。其原理是用小的瓷磚(Tile)拼接出一張大的地圖。這樣做的好處很多,最明顯的當然就是節省內存,大大提高OpenGL的渲染繪圖性能。很多遊戲開發引擎都內置了對瓷磚地圖的支持,Cocos2D當然也不會例外。

瓷磚地圖其實是二維數組,數組中的每個元素都包含地圖中的某個特定區域信息。此類信息包括該區域中所顯示的圖像、瓷磚的碰撞屬性等。

對於創建遊戲中的大型關卡(特別是RPG角色扮演類遊戲)瓷磚地圖非常有用。即使遊戲不是很大,如果爲每個關卡創建不同的滾動背景,也需要用到瓷磚地圖。


(11)CCParticleSystem(粒子系統類)

粒子系統是計算機圖形學中用來模擬一些特定效果的技術,特別是一些模糊的現象。這些現象用傳統的渲染技術難以實現。使用粒子效果可以模擬的現象有火、爆炸、煙、水流、火花、落葉、雲、霧、雪、塵、流星尾跡或發光軌跡這樣的模糊而又抽象的視覺效果。

在Cocos2D中提供了幾個與創建和編輯粒子系統相關的類。瞭解並掌握了這些類之後,就可以在遊戲中輕鬆的創建和編譯粒子系統。其中主要是CCParticleSystem、CCParticleSystemQuad和CCParticleBatchNode類。此外cocos2d還內置了多種粒子特效。


以上概念對於cocos2d遊戲開發者來說應該是非常熟悉的了,這裏再次歸納一下是爲了便於和Sprite Kit進行全面的對比。

實際上,以上的11種核心類就是一款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的代碼非常簡潔明瞭:


    // Configure the view.

    SKView * skView = (SKView *)self.view;

    skView.showsFPS = YES;

    skView.showsNodeCount = YES;


而緊接着就是創建和配置遊戲場景的代碼


(3)SKScene vs CCScene


與cocos2d中的CCScene類似,Sprite Kit中的SKScene更多起到一個容器的作用,但比起CCScene,SKScene的任務更多一些。


首先,SKScene是一個抽象類,因此在實際的項目中必須創建該類的子類。遊戲的主要內容和邏輯都會在子類中運行。

SKScene的任務包括:

.調用update:方法

.在其子節點上執行動作;

.調用didEvaluateActions方法;

.對場景中的物體執行物理模擬計算;

.調用didSimulatePhysics方法。


說到這裏,就不得不說一下Sprite Kit遊戲的循環。

初探使用iOS <wbr>7 <wbr>Sprite <wbr>Kit與Cocos2d開發遊戲的對比



進入遊戲後,由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可以達到完全相同的效果。


  1. 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的幫助,但功能顯然要強大很多。



7.工具對比


用過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手機遊戲開發的首選工具呢?

在作出自己的結論之間,先用表格的方式來做一個小小的總結。



Sprite Kit

Cocos2d-iPhone

Cocos2d-x

跨平臺性

只支持iOS

只支持iOS

支持iOS,Android,Windows

創建紋理圖集

內置工具

第三方工具

第三方工具

物理引擎

無,第三方

無,第三方

粒子效果

內置工具

第三方工具

第三方工具

字體

內置工具

第三方工具

第三方工具

第三方工具

第三方工具

戲界面

內置工具

第三方工具

第三方工具

發語言

Objective-C

Objective-C

C++/Lua/Javascript

上手難度

容易

較容易

較容易

發人員成本

第三方工具支持

暫無

普及程度

剛開始

國外較高

國內較高

構複雜度

簡單

較複雜

較複雜,稍顯混亂



整理完這個表格之後,下面就是我個人的結論:

  1. Sprite Kit作爲iOS 7 內置的遊戲開發工具,短期內不太可能替代cocos2d-x,但很有可能完全替代cocos2d-iphone。
  2. 如果要支持跨平臺開發,那麼2D遊戲引擎還是首選cocos2d-x,沒有其它。按照蘋果的風格,Sprite Kit這麼霸氣的工具是不可能支持Android遊戲開發的。
  3. 初學手機遊戲開發的,如果只想搞iOS遊戲開發,那麼可以直接學Sprite Kit,不必從cocos2d-iphone學起。

    4.現有的開發者,如果只專注iOS遊戲,那麼完全沒必要轉到Sprite Kit。cocos2d的功能足夠強大。

    5.Sprite Kit的成功與否取決於iOS平臺能否繼續發力。


實戰篇


忘了說這個了。爲了實際比較,過段時間會做一個簡單的實例,分別提供cocos2d-iphone版,cocos2d-x版和Sprite Kit版,放在這裏作爲參考。

發佈了22 篇原創文章 · 獲贊 1 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章