iOS7
OS7 beta發布后,大部分開發者和用戶的注意力都集中在了iOS 7的全新UI交互設計界面上。一直負責硬件工業設計的Jony Ive首次全面負責蘋果的軟件和硬件設計工作,自然要把他自己的設計理念完整詮釋一番。加上和iOS之父Scott Forstall一直以來的不和,Jony對之前擬物化風格的全面顛覆設計也是必然的結果。
? ??
如今iOS7 已經在一番喧囂的或謾罵或驚嘆之后,人們逐漸開始接受了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平臺能否繼續發力。
總結
- 上一篇: win8.1+ubuntu13.10 双
- 下一篇: 面向对象程序设计(JAVA)复习笔记(下