iOS SpriteKit 游戲

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


重復(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)立倍。弧度為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é)點樹浸颓。

? ??

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尽超,一起剝皮案震驚了整個濱河市官撼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌似谁,老刑警劉巖傲绣,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掠哥,死亡現(xiàn)場離奇詭異,居然都是意外死亡秃诵,警方通過查閱死者的電腦和手機龙致,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顷链,“玉大人目代,你說我怎么就攤上這事∴土罚” “怎么了榛了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煞抬。 經(jīng)常有香客問我霜大,道長,這世上最難降的妖魔是什么革答? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任战坤,我火速辦了婚禮,結(jié)果婚禮上残拐,老公的妹妹穿的比我還像新娘途茫。我一直安慰自己,他們只是感情好溪食,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布囊卜。 她就那樣靜靜地躺著,像睡著了一般错沃。 火紅的嫁衣襯著肌膚如雪栅组。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天枢析,我揣著相機與錄音玉掸,去河邊找鬼。 笑死醒叁,一個胖子當(dāng)著我的面吹牛司浪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辐益,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼断傲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了智政?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤箱蝠,失蹤者是張志新(化名)和其女友劉穎续捂,沒想到半個月后垦垂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡牙瓢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年劫拗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矾克。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡页慷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胁附,到底是詐尸還是另有隱情酒繁,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布控妻,位于F島的核電站州袒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弓候。R本人自食惡果不足惜郎哭,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菇存。 院中可真熱鬧夸研,春花似錦、人聲如沸依鸥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毕籽。三九已至抬闯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間关筒,已是汗流浹背溶握。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒸播,地道東北人睡榆。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像袍榆,于是被迫代替她去往敵國和親胀屿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容