iOS SpriteKit 游戲

????????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é)點樹。

? ??

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容