先放最終效果圖:
更新01/20/2017:由Kevin Colligan更新為iOS 10,Xcode 8和Swift 3。原文由Tammy Coron發(fā)表,最近由Nick Lockwood更新。原文鏈接
Cut The Rope是一種受歡迎的物理驅(qū)動(dòng)游戲,玩家通過剪切掛起糖果的繩索喂養(yǎng)一只名叫Om Nom的怪獸离陶。在正確的時(shí)間和地點(diǎn)切斷繩索,Om Nom將獲得美味佳肴衅檀。
在對(duì)Om Nom充分尊重的情況下枕磁,游戲的真正主角是模擬物理學(xué):繩索擺動(dòng),重力拉動(dòng)术吝,讓糖果按照您在現(xiàn)實(shí)生活中期望那樣下落计济。
您可以使用Apple的2D游戲框架SpriteKit的物理引擎構(gòu)建類似的體驗(yàn)茸苇。在本教程中,您將會(huì)做一個(gè)名為Snip The Vine的游戲沦寂。
注意:本教程假設(shè)您有一些SpriteKit的經(jīng)驗(yàn)学密。如果您是SpriteKit的新手,請(qǐng)查看我們的SpriteKit Swift初學(xué)者教程传藏。
入門
在Snip The Vine腻暮,您可以將菠蘿喂給鱷魚。在開始之前毯侦,請(qǐng)下載啟動(dòng)項(xiàng)目哭靖。在Xcode中打開項(xiàng)目,以便快速查看它的結(jié)構(gòu)侈离。
項(xiàng)目文件分割在多個(gè)文件夾中试幽。在本教程中,您可以使用包含主代碼文件的Classes文件夾卦碾。隨便瀏覽其他文件夾铺坞,如下所示:
設(shè)定常數(shù)
常數(shù)通過避免重復(fù)使用含義不明確的字符串或數(shù)字,使您的代碼更易于閱讀和維護(hù)洲胖。
打開Constants.swift并添加以下代碼:
struct ImageName {
static let Background = “Background”
static let Ground = “Ground”
static let Water = “Water”
static let VineTexture = “VineTexture”
static let VineHolder = “VineHolder”
static let CrocMouthClosed = “CrocMouthClosed”
static let CrocMouthOpen = “ CrocMouthOpen“
static let CrocMask = ”CrocMask”
static let Prize = “Pineapple”
static let PrizeMask = “PineappleMask”
}
struct SoundFile {
static let BackgroundMusic = “CheeZeeJungle.caf”
static let Slice = “Slice.caf”
static let Splash = “Splash.caf”
static let NomNom = “NomNom.caf”
}
使用以上代碼济榨,您定義了一些常量保存sprite圖像名稱和聲音文件名稱。
在下面添加以下內(nèi)容:
struct Layer {
static let Background: CGFloat = 0
static let Crocodile: CGFloat = 1
static let Vine: CGFloat = 1
static let Prize: CGFloat = 2
static let Foreground: CGFloat = 3
}
struct PhysicsCategory {
static let Crocodile: UInt32 = 1
static let VineHolder: UInt32 = 2
static let Vine: UInt32 = 4
static let Prize: UInt32 = 8
}
上面的代碼聲明了兩個(gè)結(jié)構(gòu)體:Layer
和PhysicsCategory
绿映,它們分別包含一些static
CGFloat
和UInt32
的屬性擒滑。當(dāng)您將它們添加到場(chǎng)景中時(shí),將使來指定精靈的zPosition和物理學(xué)屬性叉弦。
最后再添加一個(gè)struct
:
struct GameConfiguration {
static let VineDataFile = “VineData.plist”
static let CanCutMultipleVinesAtOnce = false
}
VineDataFile
指定了葡萄藤所在位置文件的名稱丐一。
CanCutMultipleVinesAtOnce
允許通過簡單的方式修改游戲參數(shù)。怎樣的游戲決策會(huì)使游戲更有趣卸奉,這總是并不明確的钝诚。這樣的常數(shù)提供了一種簡單的開關(guān)方式颖御,讓你可以稍后改變你的游戲榄棵。
現(xiàn)在,您可以開始向場(chǎng)景添加節(jié)點(diǎn)潘拱。
向場(chǎng)景添加背景Sprite
打開GameScene.swift并將以下內(nèi)容添加到setUpScenery()
:
let background = SKSpriteNode(imageNamed: ImageName.Background)
background.anchorPoint = CGPoint(x: 0, y: 0)
background.position = CGPoint(x: 0, y: 0)
background.zPosition = Layer.Background
background.size = CGSize(width: size.width, height: size.height)
addChild(background)
let water = SKSpriteNode(imageNamed: ImageName.Water)
water.anchorPoint = CGPoint(x: 0, y: 0)
water.position = CGPoint(x: 0, y: 0)
water.zPosition = Layer.Foreground
water.size = CGSize(width: size.width, height: size.height * 0.2139)
addChild(water)
setUpScenery()
在didMove()
方法中被調(diào)用疹鳄。在這個(gè)方法中,創(chuàng)建一些SKSpriteNode
實(shí)例芦岂,并調(diào)用SKSpriteNode(imageNamed:)
進(jìn)行初始化瘪弓。為了處理多個(gè)屏幕尺寸,您需要顯式設(shè)置背景圖像的大小禽最。
您將節(jié)點(diǎn)的anchorPoint
從默認(rèn)值(0.5,0.5)更改為(0,0)腺怯。這意味著節(jié)點(diǎn)從原本的相對(duì)于中心定位變成了相對(duì)于左下角定位袱饭,這使您可以輕松地將background
和water
與場(chǎng)景底部對(duì)齊。
注意:anchorPoint
屬性使用單位坐標(biāo)系呛占,其中(0,0)表示圖像的左下角虑乖,(1,1)表示右上角。因?yàn)樗闹悼偸菑?到1晾虑,所以這些坐標(biāo)與圖像尺寸和寬高比無關(guān)疹味。
您還可以設(shè)置Sprite的zPosition
,控制節(jié)點(diǎn)在屏幕上的繪制順序帜篇。
回想一下糙捺,在Constants.swift中,您指定了一些用于zPosition
的值笙隙。這里使用其中的:Layer.Background
和Layer.Foreground
洪灯,確保背景總是落在另外的Sprite之后,前景將始終畫在最前面逃沿。
編譯并運(yùn)行您的項(xiàng)目婴渡。如果您做的一切正確,您應(yīng)該看到以下效果:
下一篇文章將開始在項(xiàng)目中添加游戲的主角——鱷魚凯亮。