天天看點

SpriteKit學習筆記(六)關于SpriteKit與cocos2d

今早看了一篇文章,關于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遊戲的循環。  

SpriteKit學習筆記(六)關于SpriteKit與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可以達到完全相同的效果。   (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開發遊戲的對比

繼續閱讀