2015-11-06 31 views
2

我正嘗試在本教程的跳轉游戲中創建一個靜態HUD,該HUD始終位於整個遊戲的屏幕頂部。我還是新斯威夫特,所以也許這是一個約定,我不容易看到:在Sprite套件中創建HUD,屏幕上保持靜態

http://www.raywenderlich.com/87232/make-game-like-mega-jump-sprite-kit-swift-part-2

在本教程中,他把HUD在override init(size: CGSize)功能:

required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

override init(size: CGSize) { 
     super.init(size: size) 
    ... 

    // Build the HUD 

    // HUD 
    hudNode = SKNode() 
    hudNode.zPosition = 1000 
    addChild(hudNode) 


    // Coins 
    // 1 
    let coin = SKSpriteNode(imageNamed: "powerup05_1") 
    coin.position = CGPoint(x: 300, y: self.size.height-100) 
    coin.zPosition = 1000 
    hudNode.addChild(coin) 

    // 2 
    lblCoins = SKLabelNode(fontNamed: "ChalkboardSE-Bold") 
    lblCoins.fontSize = 70 
    lblCoins.fontColor = SKColor.whiteColor() 
    lblCoins.position = CGPoint(x: 375, y: self.size.height-100) 
    lblCoins.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Left 
    lblCoins.zPosition = 1000 

    // 3 
    lblCoins.text = String(format: "X %d", GameState.sharedInstance.coins) 
    hudNode.addChild(lblCoins) 

    // Score 
    // 4 
    lblScore = SKLabelNode(fontNamed: "ChalkboardSE-Bold") 
    lblScore.fontSize = 70 
    lblScore.fontColor = SKColor.whiteColor() 
    lblScore.position = CGPoint(x: self.size.width-325, y: self.size.height-100) 
    lblScore.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Right 
    lblScore.zPosition = 1000 

    // 5 
    lblScore.text = "0" 
    hudNode.addChild(lblScore) 
} 

然而,如果我嘗試在我的遊戲中使用這個功能我得到一個錯誤:

Argument labels '(fileNamed:)' do not match any available overloads

在這個函數:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    switch gameState.currentState { 
    case is WaitingForTap: 
    gameState.enterState(WaitingForBomb) 
    // Switch to playing state 
    self.runAction(SKAction.waitForDuration(2.0), 
    completion:{ 
     self.gameState.enterState(Playing) 
    }) 

    case is GameOver: 
    // Error! Argument labels '(fileNamed:)' do not match any available overloads 
    let newScene = GameScene(fileNamed:"GameScene") 
    newScene!.scaleMode = .AspectFill 
    let reveal = SKTransition.flipHorizontalWithDuration(0.5) 
    self.view?.presentScene(newScene!, transition: reveal) 

    default: 
    break 
    } 
} 

所以我使出把它在override func didMoveToView(view: SKView),但HUD移動一旦玩家跳起來:

override func didMoveToView(view: SKView) { 
.... 
// Build the HUD 

// HUD 
hudNode = SKNode() 
hudNode.zPosition = 1000 
addChild(hudNode) 


// Coins 
// 1 
let coin = SKSpriteNode(imageNamed: "powerup05_1") 
coin.position = CGPoint(x: 300, y: self.size.height-100) 
coin.zPosition = 1000 
hudNode.addChild(coin) 

// 2 
lblCoins = SKLabelNode(fontNamed: "ChalkboardSE-Bold") 
lblCoins.fontSize = 70 
lblCoins.fontColor = SKColor.whiteColor() 
lblCoins.position = CGPoint(x: 375, y: self.size.height-100) 
lblCoins.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Left 
lblCoins.zPosition = 1000 

// 3 
lblCoins.text = String(format: "X %d", GameState.sharedInstance.coins) 
hudNode.addChild(lblCoins) 

// Score 
// 4 
lblScore = SKLabelNode(fontNamed: "ChalkboardSE-Bold") 
lblScore.fontSize = 70 
lblScore.fontColor = SKColor.whiteColor() 
lblScore.position = CGPoint(x: self.size.width-325, y: self.size.height-100) 
lblScore.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Right 
lblScore.zPosition = 1000 

// 5 
lblScore.text = "0" 
hudNode.addChild(lblScore) 
} 
+0

是你的遊戲場景子類化SKScene? GameScene:SKScene {...} – Stefan

+0

是的。我的代碼如下所示:'class GameScene:SKScene,SKPhysicsContactDelegate {' – Paul

+0

是否可以將代碼上傳到github?我在這裏發佈的部分找不到錯誤 – Stefan

回答

5

將您hudNodecameraNode使得HUD與相機一起移動以便它在屏幕上看起來是靜態的。即將addChild(hudNode)更改爲cameraNode.addChild(hudNode)

然後使用convert(_:to:)將點從當前場景座標更改爲cameraNode座標。這將通過一些修改來設置HUD在新座標中的位置。例如,改變coin.position這樣的:

coin.position = convert(CGPoint(x: 300, y: self.size.height-100), to: cameraNode) 

做同樣的事情在其他HUD:

lblCoins.position = convert(CGPoint(x: 375, y: self.size.height-100), to: cameraNode) 
lblScore.position = convert(CGPoint(x: self.size.width-325, y: self.size.height-100), to: cameraNode) 

結果這4條線修改後:

enter image description here

+0

哇。我從來沒有想過這件事。斯威夫特對我來說仍然是新的。謝謝你的幫助! – Paul

+0

使用addChild()函數確實比設置hudNode.position = camera.position更好。 – jmcmahon443

+0

@ jmcmahon443是的,但你很近! – Paul