????????SpriteKit是一個圖形渲染和動畫基礎設施,你可以使用它來動畫化任 意紋理圖像,也稱為精靈。?SpriteKit提供了一個傳統(tǒng)的渲染循環(huán),可以在確定內容和渲染幀之間進行交替。
????????你可以確定框架內容以及如何更改這些內容。?SpriteKit使用圖形硬件以有效地渲染該框架。?SpriteKit還針對內容進行任意動畫或變更進行了優(yōu)化。 該設計使SpriteKit更適合需要靈活處理動畫的游戲和應用程序。
????????SpriteKit 還提供了其他對游戲非常有用的功能,包括基本的聲音播放支持和物理模擬。
????????SpriteKit?在iOS?和iOS X可用,它使用主機設備提供的圖像硬件,以高幀數復合2D圖像。Sprite Kit?支持多種不同的內容,包括:
??無紋理或者有紋理的矩形(精靈)
??文本
??任意集于CGPath的形狀
??視頻
????????SpriteKit?還提供了裁剪和其他特效的支持,允許你對全部或者部分內容應用這些效果。你可以在每一幀活動(animate)或者改變這些元素,你也可以附加物理主體到這些元素,使得他們正確的支持碰撞檢測。
以下是sprikit的3個基本概念?
?Scenes
? ??????游戲中的內容被組織成由SKScene對象表示的Scenes 。 Scenes容納 精靈和其他要呈現的內容。?Scenes還實現了每幀邏輯和內容處理。 在任何給定的時間,視圖呈現一個Scenes?。只要呈現Scenes?,它的動畫和每幀邏輯就會自動執(zhí)行。
??Nodes
? ??????SKNode類是大多數SpriteKit內容的基本構建塊。 使用預定義的SKNode子類繪制基于SpriteKit的游戲中的所有視覺元素。
????????每個節(jié)點的位置在由其父節(jié)點定義的坐標系中指定。節(jié)點還對其內容及其后代的內容應用其他屬性。例如,當一個節(jié)點被旋轉時,它的所有后代也被旋轉。你可以使用樹節(jié)點構建復雜的圖像,然后通過調整最上面的節(jié)點的屬性來旋轉,縮放和混合整個圖像。
????????SKNode類不繪制任何東西,但它將其屬性應用于其后代。每種可繪制的內容由SpriteKit中的一個不同的子類表示。一些其他節(jié)點子類不會繪制 自己的內容,而是修改其后代的行為。
??Actions
? ??????動作是自包含的對象。每一個動作是一個不透明的(opaque)對象, 描述你想對場景做的改變。一切動作都是由SKAction類實現,它沒有可見的子類。
????????當場景處理動畫幀時,執(zhí)行Action。一些Action在一幀動畫中完成, 而有些Action在完成之前會對多個動畫幀進行更改。Action最常見的 用法是更改節(jié)點的屬性。例如,Action可以創(chuàng)建、移動節(jié)點,縮放或 旋轉節(jié)點或使其變得透明。Action也可以改變節(jié)點樹,播放聲音,甚至執(zhí)行自定義代碼。
使用精靈
????????創(chuàng)建一個紋理精靈的最簡單方法是讓Sprite Kit?為你創(chuàng)建紋理和精靈。可以把插 圖存儲在bundle中,然后在運行時加載
????????//從存儲在bundle中的圖像創(chuàng)建一個紋理的精靈
????????let spaceship = SKSpriteNode(imageNamed:”rocket”)?
????????spaceship.position = CGPointMake(100,100)?
????????self.addChild(spaceship)
當你使用這種方式時,你可以獲得很多默認行為:
??精靈以匹配紋理尺寸的框架(frame)來創(chuàng)建.
??精靈以它的位置為中心來渲染。精靈的frame屬性指定的矩形定義了它所涵蓋的面積?.
??精靈紋理在幀緩沖區(qū)(framebuffer)中是半透明的(alpha-blended).?
??一個SKTexture對象被創(chuàng)建并附加到精靈上.
調整精靈尺寸,可有3個屬性決定:
??精靈的size屬性。
??基準尺寸。根據精靈從SKNode類繼承來的xScale?與yScale屬性進 行縮放。
??當精靈的框架大于它的紋理時,紋理被拉伸以覆蓋框架。?
對精靈著色
??可以使用color和colorBlendFactor屬性對它著色。?
??可以使用動作讓顏色和顏色混合因素稱為動畫。
使用紋理對象:紋理對象時可應用于精靈的可復用的圖像。
??我們可以使用SKTexture對象完成紋理對象的使用。
let bottomLeftTexture = SKTexture(rect: CGRectMake(0.0,0.0,0.5,0.5),inTexture:cornerTextures)
??使用創(chuàng)建對象獨立于創(chuàng)造精靈。然后使用紋理對象來創(chuàng)建新的精靈或者改變現有精靈的紋理。他和Sprite Kit為你創(chuàng)建紋理相似,但是你能對過程擁有更多的控制權。
let pulsedRed = SKAction.sequence([SKAction.colorizeWithColor(SKColor.redColor(),colorBlendFactor:1.0,duration:0.15)
SKAction..waitForDuration(0.1)
SKAction.colorrizeWithColorBlendFactor(0.0,duration :0.15)]) monsterSprite.runAction(pulsedRed)
添加動作到節(jié)點
????????繪制精靈僅僅繪制來靜態(tài)圖像。如果想要一個完整的游戲,添加游戲 劇本(game play),你需要能夠讓精靈在屏幕周圍移動并執(zhí)行其它 邏輯。SpriteKit讓場景動起來所使用的主要機制是Action。
????????通過Action定義你想對場景所作的改變。在大多數情況下,一個Actio n對執(zhí)行該Action的節(jié)點應用其變化。舉例來說,如果你想要屏幕上移 動精靈,你創(chuàng)建一個移動Action,并告訴精靈節(jié)點運行該Action。SpriteKit自動動態(tài)改變精靈的位置直到Action完成。
????????一旦Action被創(chuàng)建,它的類型就不能再改變,并且只能有限的來改變其 屬性。在此基礎上,Spriter Kit利用Action不變性的性質非常有效地執(zhí)行它們。
而一個Action只有在你告訴一個節(jié)點運行它之后才會執(zhí)行,運行一個節(jié)點
最簡單的方法是調用節(jié)點的runAction?方法。
let moveNodeUo = SKAction.moveByX(0.0,y:100.0,duration:1.0)
rocket.runAction(moveNodeUp)
Sprite Kit?提供了許多標準類型用來改變你的場景中的節(jié)點的屬性,你 可以通過結合Action創(chuàng)建復雜和有表現力的動畫,這些動畫仍然通過運 行一個單一的Action來執(zhí)行:
??序列動作(sequence action)具有多個子動作。序列是一個連續(xù)運行 的動作結合(set),序列中的每一個動作在前一個動作結束后開始。
??組動作(group action)具有多個子動作。組動作是一組在執(zhí)行時就 同時執(zhí)行的全部動作的集合(colllection)。
??重復動作(repeating action?)只有一個子動作。當子動作完成后, 它就重新啟動,其允許循環(huán)另一個動作。
序列動作
let moveUp = SKAction.moveByX(0,y:100,duration:1)?
let zoom = SKAction.scaleTo(2.0,duration:0.25)
let wait = SKAction.waitForDuraion(0.5)
let fadeAway = SKAction.fadeOutWithDuraion(0.25)
?let removeNode = SKAction.removeFromParent()
let sequence = SKAction.sequence([moveup,zoom,wait,removeNode]) node.runAction(sequence)
組動作
sprite.setScale(0)
let animate = SKAction.animateWith(0,y:100,duration:1)
let moveDown= SKAction.moveByX(0,y:-200,duration:2.0)
let scale = SKAction.scaleTo(1.0,duration:1.0)
let fadeIn = SKAction.fadeInWithDuration(1.0)
let group = SKAction.group([animate,moveDown,scale,fadeIn])
重復動作
let fadeOut = SKAction.fadeOutWithDuraion(1)
let fadeIn = SKAction.fadeInWithDuration(1)
let pulse = SKAction.sequence([fadeOut,fadeIn])
let pulseThreeTimes = SKActions.repeatAction(pulse,count:3)
?let pulseForever = SKAction.repeatActionForever(pulse)
構建場景
場景的基本概念如下:
??場景(SKScene對象),用來提供SKView對象要渲染的內容。
??場景的內容被創(chuàng)建為樹狀的節(jié)點對象。場景是根節(jié)點。
??在場景由視圖呈現時,它運行動作并模擬物理,然后渲染節(jié)點樹。
??你可以通過子類化SKScene類創(chuàng)建自定義的場景。
節(jié)點給子節(jié)點提供坐標系。當一個節(jié)點被放置在節(jié)點樹中,它的position屬性把它定位在由它的父節(jié)點提供的坐標系內。SpriteKit在iOS和OS X中使用相同坐標系,并以點測量。
SpriteKit?有一個標準旋轉約定(rotation convention)。弧度為0?的 角指定正x軸。沿逆時針方向為正角度。
創(chuàng)建場景:
??場景由視圖呈現。
??場景的尺寸定義其可見區(qū)域。
??場景渲染后它內容會復制到呈現試圖。
??如場景和視圖尺寸不同,則會縮放場景。
創(chuàng)建節(jié)點樹:
?通過創(chuàng)建節(jié)點之間父子關系創(chuàng)建節(jié)點樹。
?每個節(jié)點維護一個有序的子節(jié)點列表,讀取節(jié)點的children屬性進行引用。
?子節(jié)點在樹中的順序會影響場景處理多個方面,包括碰撞檢測(hit testing)和渲染,所以必須適當的組織節(jié)點樹。
? ??
場景間過渡
?場景是游戲的基本構建塊。你為游戲各部分設計自包含(self-contained)的場景。然后在必要時在這些場景之間過渡,例如:???在其他內容加載時的加載場景。
??選擇要玩什么游戲的主菜單場景。
??用戶驗證的特定類型游戲的配置細節(jié)的場景。
??提供游戲的場景。
??當游戲結束時顯示的場景。
當在一個已經呈現場景的視圖上呈現新場景時,使用過渡動畫,從而使場景變化顯得自然。
SpriteKit的優(yōu)點
??它直接編譯在iOS原生框架上:它沒有必要去下載額外的庫或者產生外部依賴。你可以在不依靠額外的插件的情況下無縫地使用其它比如像iAd,In-App Purchases等等之類的iOS框架。
??它依賴你現有的技能:如果已經了解Swift和iOS的開發(fā),你可以馬上學 會Sprite Kit。
??這是Apple官方提供的:它給你了你遷移到所有Apple新產品支持的優(yōu)勢。
??這是免費的。
實例 RainCat:?Demo
步驟:
??(為游戲)添加地面;
??(為游戲)添加雨滴;
??初始化物理引擎;
??添加雨傘對象,進行遮雨;
??利用?categoryBitMask?和?contactTestBitMask?來實現碰撞檢測;
??創(chuàng)造一個全局邊界(?world boundary?)來移除落出屏幕的結點(?node?)。
參考資料:《Sprite Kit Programming Guide》