先放最終效果圖:
更新01/20/2017:由Kevin Colligan更新為iOS 10,Xcode 8和Swift 3。原文由Tammy Coron發表,最近由Nick Lockwood更新。原文鏈接
Cut The Rope是一種受歡迎的物理驅動游戲,玩家通過剪切掛起糖果的繩索喂養一只名叫Om Nom的怪獸。在正確的時間和地點切斷繩索,Om Nom將獲得美味佳肴。
在對Om Nom充分尊重的情況下,游戲的真正主角是模擬物理學:繩索擺動,重力拉動,讓糖果按照您在現實生活中期望那樣下落。
您可以使用Apple的2D游戲框架SpriteKit的物理引擎構建類似的體驗。在本教程中,您將會做一個名為Snip The Vine的游戲。
注意:本教程假設您有一些SpriteKit的經驗。如果您是SpriteKit的新手,請查看我們的SpriteKit Swift初學者教程。
入門
在Snip The Vine,您可以將菠蘿喂給鱷魚。在開始之前,請下載啟動項目。在Xcode中打開項目,以便快速查看它的結構。
項目文件分割在多個文件夾中。在本教程中,您可以使用包含主代碼文件的Classes文件夾。隨便瀏覽其他文件夾,如下所示:
設定常數
常數通過避免重復使用含義不明確的字符串或數字,使您的代碼更易于閱讀和維護。
打開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圖像名稱和聲音文件名稱。
在下面添加以下內容:
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
}
上面的代碼聲明了兩個結構體:Layer
和PhysicsCategory
,它們分別包含一些static
CGFloat
和UInt32
的屬性。當您將它們添加到場景中時,將使來指定精靈的zPosition和物理學屬性。
最后再添加一個struct
:
struct GameConfiguration {
static let VineDataFile = “VineData.plist”
static let CanCutMultipleVinesAtOnce = false
}
VineDataFile
指定了葡萄藤所在位置文件的名稱。
CanCutMultipleVinesAtOnce
允許通過簡單的方式修改游戲參數。怎樣的游戲決策會使游戲更有趣,這總是并不明確的。這樣的常數提供了一種簡單的開關方式,讓你可以稍后改變你的游戲。
現在,您可以開始向場景添加節點。
向場景添加背景Sprite
打開GameScene.swift并將以下內容添加到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()
方法中被調用。在這個方法中,創建一些SKSpriteNode
實例,并調用SKSpriteNode(imageNamed:)
進行初始化。為了處理多個屏幕尺寸,您需要顯式設置背景圖像的大小。
您將節點的anchorPoint
從默認值(0.5,0.5)更改為(0,0)。這意味著節點從原本的相對于中心定位變成了相對于左下角定位,這使您可以輕松地將background
和water
與場景底部對齊。
注意:anchorPoint
屬性使用單位坐標系,其中(0,0)表示圖像的左下角,(1,1)表示右上角。因為它的值總是從0到1,所以這些坐標與圖像尺寸和寬高比無關。
您還可以設置Sprite的zPosition
,控制節點在屏幕上的繪制順序。
回想一下,在Constants.swift中,您指定了一些用于zPosition
的值。這里使用其中的:Layer.Background
和Layer.Foreground
,確保背景總是落在另外的Sprite之后,前景將始終畫在最前面。
編譯并運行您的項目。如果您做的一切正確,您應該看到以下效果:
下一篇文章將開始在項目中添加游戲的主角——鱷魚。