做一個類似Cut The Rote 的游戲(一)

先放最終效果圖:

剪斷

更新01/20/2017:由Kevin Colligan更新為iOS 10,Xcode 8和Swift 3。原文Tammy Coron發(fā)表,最近由Nick Lockwood更新。原文鏈接

Cut The Rope是一種受歡迎的物理驅(qū)動游戲,玩家通過剪切掛起糖果的繩索喂養(yǎng)一只名叫Om Nom的怪獸。在正確的時間和地點(diǎn)切斷繩索,Om Nom將獲得美味佳肴。

在對Om Nom充分尊重的情況下,游戲的真正主角是模擬物理學(xué):繩索擺動,重力拉動,讓糖果按照您在現(xiàn)實(shí)生活中期望那樣下落。

您可以使用Apple的2D游戲框架SpriteKit的物理引擎構(gòu)建類似的體驗(yàn)。在本教程中,您將會做一個名為Snip The Vine的游戲。

注意:本教程假設(shè)您有一些SpriteKit的經(jīng)驗(yàn)。如果您是SpriteKit的新手,請查看我們的SpriteKit Swift初學(xué)者教程

入門

Snip The Vine,您可以將菠蘿喂給鱷魚。在開始之前,請下載啟動項(xiàng)目。在Xcode中打開項(xiàng)目,以便快速查看它的結(jié)構(gòu)。

項(xiàng)目文件分割在多個文件夾中。在本教程中,您可以使用包含主代碼文件的Classes文件夾。隨便瀏覽其他文件夾,如下所示:

文件結(jié)構(gòu)

設(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 
  }

上面的代碼聲明了兩個結(jié)構(gòu)體:LayerPhysicsCategory,它們分別包含一些static CGFloatUInt32的屬性。當(dāng)您將它們添加到場景中時,將使來指定精靈的zPosition和物理學(xué)屬性。

最后再添加一個struct

struct  GameConfiguration  {
  static  let  VineDataFile = “VineData.plist” 
  static  let CanCutMultipleVinesAtOnce = false 
  }

VineDataFile指定了葡萄藤所在位置文件的名稱。

CanCutMultipleVinesAtOnce允許通過簡單的方式修改游戲參數(shù)。怎樣的游戲決策會使游戲更有趣,這總是并不明確的。這樣的常數(shù)提供了一種簡單的開關(guān)方式,讓你可以稍后改變你的游戲。

現(xiàn)在,您可以開始向場景添加節(jié)點(diǎn)。

向場景添加背景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)用。在這個方法中,創(chuàng)建一些SKSpriteNode實(shí)例,并調(diào)用SKSpriteNode(imageNamed:)進(jìn)行初始化。為了處理多個屏幕尺寸,您需要顯式設(shè)置背景圖像的大小。

您將節(jié)點(diǎn)的anchorPoint從默認(rèn)值(0.5,0.5)更改為(0,0)。這意味著節(jié)點(diǎn)從原本的相對于中心定位變成了相對于左下角定位,這使您可以輕松地將backgroundwater與場景底部對齊。

注意:anchorPoint屬性使用單位坐標(biāo)系,其中(0,0)表示圖像的左下角,(1,1)表示右上角。因?yàn)樗闹悼偸菑?到1,所以這些坐標(biāo)與圖像尺寸和寬高比無關(guān)。

您還可以設(shè)置Sprite的zPosition,控制節(jié)點(diǎn)在屏幕上的繪制順序。

回想一下,在Constants.swift中,您指定了一些用于zPosition的值。這里使用其中的:Layer.BackgroundLayer.Foreground,確保背景總是落在另外的Sprite之后,前景將始終畫在最前面。

編譯并運(yùn)行您的項(xiàng)目。如果您做的一切正確,您應(yīng)該看到以下效果:

背景圖

下一篇文章將開始在項(xiàng)目中添加游戲的主角——鱷魚。

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

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

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