????????SpriteKit是一個圖形渲染和動畫基礎(chǔ)設(shè)施耻警,你可以使用它來動畫化任 意紋理圖像叹放,也稱為精靈沐寺。?SpriteKit提供了一個傳統(tǒng)的渲染循環(huán),可以在確定內(nèi)容和渲染幀之間進行交替。
????????你可以確定框架內(nèi)容以及如何更改這些內(nèi)容宪塔。?SpriteKit使用圖形硬件以有效地渲染該框架磁奖。?SpriteKit還針對內(nèi)容進行任意動畫或變更進行了優(yōu)化。 該設(shè)計使SpriteKit更適合需要靈活處理動畫的游戲和應(yīng)用程序某筐。
????????SpriteKit 還提供了其他對游戲非常有用的功能比搭,包括基本的聲音播放支持和物理模擬。
????????SpriteKit?在iOS?和iOS X可用南誊,它使用主機設(shè)備提供的圖像硬件,以高幀數(shù)復(fù)合2D圖像身诺。Sprite Kit?支持多種不同的內(nèi)容,包括:
??無紋理或者有紋理的矩形(精靈)
??文本
??任意集于CGPath的形狀
??視頻
????????SpriteKit?還提供了裁剪和其他特效的支持抄囚,允許你對全部或者部分內(nèi)容應(yīng)用這些效果霉赡。你可以在每一幀活動(animate)或者改變這些元素,你也可以附加物理主體到這些元素幔托,使得他們正確的支持碰撞檢測穴亏。
以下是sprikit的3個基本概念?
?Scenes
? ??????游戲中的內(nèi)容被組織成由SKScene對象表示的Scenes 。 Scenes容納 精靈和其他要呈現(xiàn)的內(nèi)容重挑。?Scenes還實現(xiàn)了每幀邏輯和內(nèi)容處理嗓化。 在任何給定的時間,視圖呈現(xiàn)一個Scenes?攒驰。只要呈現(xiàn)Scenes?蟆湖,它的動畫和每幀邏輯就會自動執(zhí)行故爵。
??Nodes
? ??????SKNode類是大多數(shù)SpriteKit內(nèi)容的基本構(gòu)建塊玻粪。 使用預(yù)定義的SKNode子類繪制基于SpriteKit的游戲中的所有視覺元素。
????????每個節(jié)點的位置在由其父節(jié)點定義的坐標(biāo)系中指定诬垂。節(jié)點還對其內(nèi)容及其后代的內(nèi)容應(yīng)用其他屬性劲室。例如,當(dāng)一個節(jié)點被旋轉(zhuǎn)時结窘,它的所有后代也被旋轉(zhuǎn)很洋。你可以使用樹節(jié)點構(gòu)建復(fù)雜的圖像,然后通過調(diào)整最上面的節(jié)點的屬性來旋轉(zhuǎn)隧枫,縮放和混合整個圖像喉磁。
????????SKNode類不繪制任何東西,但它將其屬性應(yīng)用于其后代官脓。每種可繪制的內(nèi)容由SpriteKit中的一個不同的子類表示协怒。一些其他節(jié)點子類不會繪制 自己的內(nèi)容,而是修改其后代的行為卑笨。
??Actions
? ??????動作是自包含的對象孕暇。每一個動作是一個不透明的(opaque)對象, 描述你想對場景做的改變。一切動作都是由SKAction類實現(xiàn)妖滔,它沒有可見的子類隧哮。
????????當(dāng)場景處理動畫幀時,執(zhí)行Action座舍。一些Action在一幀動畫中完成沮翔, 而有些Action在完成之前會對多個動畫幀進行更改。Action最常見的 用法是更改節(jié)點的屬性曲秉。例如鉴竭,Action可以創(chuàng)建、移動節(jié)點岸浑,縮放或 旋轉(zhuǎn)節(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)
當(dāng)你使用這種方式時,你可以獲得很多默認(rèn)行為:
??精靈以匹配紋理尺寸的框架(frame)來創(chuàng)建.
??精靈以它的位置為中心來渲染盖桥。精靈的frame屬性指定的矩形定義了它所涵蓋的面積?.
??精靈紋理在幀緩沖區(qū)(framebuffer)中是半透明的(alpha-blended).?
??一個SKTexture對象被創(chuàng)建并附加到精靈上.
調(diào)整精靈尺寸灾螃,可有3個屬性決定:
??精靈的size屬性。
??基準(zhǔn)尺寸揩徊。根據(jù)精靈從SKNode類繼承來的xScale?與yScale屬性進 行縮放腰鬼。
??當(dāng)精靈的框架大于它的紋理時,紋理被拉伸以覆蓋框架塑荒。?
對精靈著色
??可以使用color和colorBlendFactor屬性對它著色熄赡。?
??可以使用動作讓顏色和顏色混合因素稱為動畫。
使用紋理對象:紋理對象時可應(yīng)用于精靈的可復(fù)用的圖像齿税。
??我們可以使用SKTexture對象完成紋理對象的使用彼硫。
let bottomLeftTexture = SKTexture(rect: CGRectMake(0.0,0.0,0.5,0.5),inTexture:cornerTextures)
??使用創(chuàng)建對象獨立于創(chuàng)造精靈。然后使用紋理對象來創(chuàng)建新的精靈或者改變現(xiàn)有精靈的紋理凌箕。他和Sprite Kit為你創(chuàng)建紋理相似拧篮,但是你能對過程擁有更多的控制權(quán)。
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定義你想對場景所作的改變志笼。在大多數(shù)情況下,一個Actio n對執(zhí)行該Action的節(jié)點應(yīng)用其變化把篓。舉例來說纫溃,如果你想要屏幕上移 動精靈,你創(chuàng)建一個移動Action韧掩,并告訴精靈節(jié)點運行該Action紊浩。SpriteKit自動動態(tài)改變精靈的位置直到Action完成。
????????一旦Action被創(chuàng)建疗锐,它的類型就不能再改變坊谁,并且只能有限的來改變其 屬性。在此基礎(chǔ)上滑臊,Spriter Kit利用Action不變性的性質(zhì)非常有效地執(zhí)行它們口芍。
而一個Action只有在你告訴一個節(jié)點運行它之后才會執(zhí)行,運行一個節(jié)點
最簡單的方法是調(diào)用節(jié)點的runAction?方法雇卷。
let moveNodeUo = SKAction.moveByX(0.0,y:100.0,duration:1.0)
rocket.runAction(moveNodeUp)
Sprite Kit?提供了許多標(biāo)準(zhǔn)類型用來改變你的場景中的節(jié)點的屬性鬓椭,你 可以通過結(jié)合Action創(chuàng)建復(fù)雜和有表現(xiàn)力的動畫,這些動畫仍然通過運 行一個單一的Action來執(zhí)行:
??序列動作(sequence action)具有多個子動作关划。序列是一個連續(xù)運行 的動作結(jié)合(set)小染,序列中的每一個動作在前一個動作結(jié)束后開始。
??組動作(group action)具有多個子動作贮折。組動作是一組在執(zhí)行時就 同時執(zhí)行的全部動作的集合(colllection)裤翩。
??重復(fù)動作(repeating action?)只有一個子動作。當(dāng)子動作完成后调榄, 它就重新啟動踊赠,其允許循環(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])
重復(fù)動作
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)
構(gòu)建場景
場景的基本概念如下:
??場景(SKScene對象)振峻,用來提供SKView對象要渲染的內(nèi)容臼疫。
??場景的內(nèi)容被創(chuàng)建為樹狀的節(jié)點對象择份。場景是根節(jié)點扣孟。
??在場景由視圖呈現(xiàn)時,它運行動作并模擬物理荣赶,然后渲染節(jié)點樹凤价。
??你可以通過子類化SKScene類創(chuàng)建自定義的場景。
節(jié)點給子節(jié)點提供坐標(biāo)系拔创。當(dāng)一個節(jié)點被放置在節(jié)點樹中利诺,它的position屬性把它定位在由它的父節(jié)點提供的坐標(biāo)系內(nèi)。SpriteKit在iOS和OS X中使用相同坐標(biāo)系剩燥,并以點測量慢逾。
SpriteKit?有一個標(biāo)準(zhǔn)旋轉(zhuǎn)約定(rotation convention)立倍。弧度為0?的 角指定正x軸侣滩。沿逆時針方向為正角度口注。
創(chuàng)建場景:
??場景由視圖呈現(xiàn)。
??場景的尺寸定義其可見區(qū)域君珠。
??場景渲染后它內(nèi)容會復(fù)制到呈現(xiàn)試圖寝志。
??如場景和視圖尺寸不同,則會縮放場景策添。
創(chuàng)建節(jié)點樹:
?通過創(chuàng)建節(jié)點之間父子關(guān)系創(chuàng)建節(jié)點樹材部。
?每個節(jié)點維護一個有序的子節(jié)點列表,讀取節(jié)點的children屬性進行引用唯竹。
?子節(jié)點在樹中的順序會影響場景處理多個方面乐导,包括碰撞檢測(hit testing)和渲染,所以必須適當(dāng)?shù)慕M織節(jié)點樹浸颓。
? ??
場景間過渡
?場景是游戲的基本構(gòu)建塊兽叮。你為游戲各部分設(shè)計自包含(self-contained)的場景。然后在必要時在這些場景之間過渡猾愿,例如:???在其他內(nèi)容加載時的加載場景鹦聪。
??選擇要玩什么游戲的主菜單場景。
??用戶驗證的特定類型游戲的配置細(xì)節(jié)的場景蒂秘。
??提供游戲的場景泽本。
??當(dāng)游戲結(jié)束時顯示的場景。
當(dāng)在一個已經(jīng)呈現(xiàn)場景的視圖上呈現(xiàn)新場景時姻僧,使用過渡動畫规丽,從而使場景變化顯得自然。
SpriteKit的優(yōu)點
??它直接編譯在iOS原生框架上:它沒有必要去下載額外的庫或者產(chǎn)生外部依賴撇贺。你可以在不依靠額外的插件的情況下無縫地使用其它比如像iAd赌莺,In-App Purchases等等之類的iOS框架。
??它依賴你現(xiàn)有的技能:如果已經(jīng)了解Swift和iOS的開發(fā)松嘶,你可以馬上學(xué) 會Sprite Kit艘狭。
??這是Apple官方提供的:它給你了你遷移到所有Apple新產(chǎn)品支持的優(yōu)勢。
??這是免費的翠订。
實例 RainCat:?Demo
步驟:
??(為游戲)添加地面;
??(為游戲)添加雨滴;
??初始化物理引擎;
??添加雨傘對象巢音,進行遮雨;
??利用?categoryBitMask?和?contactTestBitMask?來實現(xiàn)碰撞檢測;
??創(chuàng)造一個全局邊界(?world boundary?)來移除落出屏幕的結(jié)點(?node?)。
參考資料:《Sprite Kit Programming Guide》