iOS SpriteKit 游戲

????????SpriteKit是一個圖形渲染和動畫基礎(chǔ)設(shè)施,你可以使用它來動畫化任 意紋理圖像,也稱為精靈。?SpriteKit提供了一個傳統(tǒng)的渲染循環(huán),可以在確定內(nèi)容和渲染幀之間進(jìn)行交替。

????????你可以確定框架內(nèi)容以及如何更改這些內(nèi)容。?SpriteKit使用圖形硬件以有效地渲染該框架。?SpriteKit還針對內(nèi)容進(jìn)行任意動畫或變更進(jìn)行了優(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在完成之前會對多個動畫幀進(jìn)行更改。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屬性進(jìn) 行縮放。

??當(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)


重復(fù)動作

構(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)?;《葹??的 角指定正x軸。沿逆時針方向為正角度。

創(chuàng)建場景:

??場景由視圖呈現(xiàn)。

??場景的尺寸定義其可見區(qū)域。

??場景渲染后它內(nèi)容會復(fù)制到呈現(xiàn)試圖。

??如場景和視圖尺寸不同,則會縮放場景。

創(chuàng)建節(jié)點樹:

?通過創(chuàng)建節(jié)點之間父子關(guān)系創(chuàng)建節(jié)點樹。

?每個節(jié)點維護(hù)一個有序的子節(jié)點列表,讀取節(jié)點的children屬性進(jìn)行引用。

?子節(jié)點在樹中的順序會影響場景處理多個方面,包括碰撞檢測(hit testing)和渲染,所以必須適當(dāng)?shù)慕M織節(jié)點樹。

? ??

節(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


示例圖

步驟:

??(為游戲)添加地面;

??(為游戲)添加雨滴;

??初始化物理引擎;

??添加雨傘對象,進(jìn)行遮雨;

??利用?categoryBitMask?和?contactTestBitMask?來實現(xiàn)碰撞檢測;

??創(chuàng)造一個全局邊界(?world boundary?)來移除落出屏幕的結(jié)點(?node?)。


參考資料:《Sprite Kit Programming Guide》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容