如何在SKScene中创建子视图?

问题描述:

Before "Buy Ship" is pressed所以我想创建一个商店,玩家可以购买新船。当玩家击中“购买按钮”图像时,我想让图像和文本的组合变得可见,这起到了一种构象屏幕的作用。希望你能在这里看到我的意思。如果你能告诉我如何除了构象盒以外的所有东西都变暗,我也将非常感激。 After "Buy Ship" is pressed如何在SKScene中创建子视图?

这是我的代码看起来像至今:

import Foundation 
import SpriteKit 

class ShopPage1: SKScene{ 


override func didMove(to view: SKView) { 

    let background = SKSpriteNode(imageNamed: "background") 
    background.position = CGPoint(x: self.size.width/2, y: self.size.height/2) 
    background.zPosition = 0 
    self.addChild(background) 

    let balance = SKLabelNode(fontNamed: "The Bold Font") 
    balance.text = "$\(balanceAmount)" 
    balance.fontSize = 100 
    balance.fontColor = SKColor.green 
    balance.position = CGPoint(x: self.size.width/2, y: self.size.height*0.87) 
    balance.zPosition = 1 
    self.addChild(balance) 

    let backToMainMenuButton = SKSpriteNode(imageNamed: "backButton2") 
    backToMainMenuButton.position = CGPoint(x: self.size.width*0.25, y: self.size.height*0.89) 
    backToMainMenuButton.zPosition = 1 
    backToMainMenuButton.size = CGSize(width: 200, height: 200) 
    backToMainMenuButton.name = "backToMainMenuButton" 
    self.addChild(backToMainMenuButton) 

    let shipNameLabel = SKLabelNode(fontNamed: "The Bold Font") 
    shipNameLabel.text = "Stealth" 
    shipNameLabel.fontSize = 200 
    shipNameLabel.fontColor = SKColor.white 
    shipNameLabel.position = CGPoint(x: self.size.width/2, y: self.size.height*0.60) 
    shipNameLabel.zPosition = 1 
    shipNameLabel.name = "shipNameLabel" 
    self.addChild(shipNameLabel) 

    let nextShipButton = SKSpriteNode(imageNamed: "nextShipButton1") 
    nextShipButton.position = CGPoint(x: self.size.width*0.75, y: self.size.height*0.40) 
    nextShipButton.zPosition = 1 
    nextShipButton.size = CGSize(width: 300, height: 300) 
    nextShipButton.name = "nextShipButton" 
    self.addChild(nextShipButton) 


    let nextShipClick = SKLabelNode(fontNamed: "The Bold Font") 
    nextShipClick.text = "▲" 
    nextShipClick.fontSize = 300 
    nextShipClick.fontColor = UIColor.clear 
    nextShipClick.position = CGPoint(x: self.size.width*0.753, y: self.size.height*0.36) 
    nextShipClick.zPosition = 2 
    nextShipClick.name = "nextShipClick" 
    self.addChild(nextShipClick) 


    let shipForSale = SKSpriteNode(imageNamed: "playerShip4") 
    shipForSale.position = CGPoint(x: self.size.width/2, y: self.size.height*0.40) 
    shipForSale.zPosition = 1 
    shipForSale.size = CGSize(width: 150, height: 300) 
    self.addChild(shipForSale) 

    let shipPodium = SKSpriteNode(imageNamed: "shipPodium") 
    shipPodium.position = CGPoint(x: self.size.width*0.527, y: self.size.height*0.31) 
    shipPodium.zPosition = 1 
    shipPodium.size = CGSize(width: 1200, height: 70) 
    self.addChild(shipPodium) 

    let shipsCostLabel = SKLabelNode(fontNamed: "The Bold Font") 
    shipsCostLabel.text = "$500" 
    shipsCostLabel.fontSize = 200 
    shipsCostLabel.fontColor = SKColor.white 
    shipsCostLabel.position = CGPoint(x: self.size.width/2, y: self.size.height*0.20) 
    shipsCostLabel.zPosition = 1 
    self.addChild(shipsCostLabel) 

    let shipBuyButton = SKSpriteNode(imageNamed: "shipBuyButton") 
    shipBuyButton.position = CGPoint(x: self.size.width*0.54, y: self.size.height*0.15) 
    shipBuyButton.zPosition = 1 
    shipBuyButton.size = CGSize(width: 1500, height: 900) 
    shipBuyButton.name = "shipBuyButton" 
    self.addChild(shipBuyButton) 

    let conformationBackground = SKSpriteNode(imageNamed: "conformationBackground") 
    conformationBackground.position = CGPoint(x: self.size.width*0.51, y: self.size.height*0.40) 
    conformationBackground.zPosition = 2 
    conformationBackground.size = CGSize(width: 1300, height: 1400) 
    conformationBackground.name = "conformationBackground" 
    self.addChild(conformationBackground) 

    let conformationScreenTextTop = SKLabelNode(fontNamed: "The Bold Font") 
    conformationScreenTextTop.text = "Are you sure you wish to" 
    conformationScreenTextTop.fontSize = 80 
    conformationScreenTextTop.fontColor = SKColor.white 
    conformationScreenTextTop.position = CGPoint(x: self.size.width/2, y: self.size.height*0.46) 
    conformationScreenTextTop.zPosition = 3 
    self.addChild(conformationScreenTextTop) 

    let conformationScreenTextBottom = SKLabelNode(fontNamed: "The Bold Font") 
    conformationScreenTextBottom.text = "pruchase this ship?" 
    conformationScreenTextBottom.fontSize = 80 
    conformationScreenTextBottom.fontColor = SKColor.white 
    conformationScreenTextBottom.position = CGPoint(x: self.size.width/2, y: self.size.height*0.41) 
    conformationScreenTextBottom.zPosition = 3 
    self.addChild(conformationScreenTextBottom) 

    let conformationScreenTextYes = SKLabelNode(fontNamed: "The Bold Font") 
    conformationScreenTextYes.text = "Yes" 
    conformationScreenTextYes.fontSize = 150 
    conformationScreenTextYes.fontColor = SKColor.green 
    conformationScreenTextYes.position = CGPoint(x: self.size.width*0.30, y: self.size.height*0.30) 
    conformationScreenTextYes.zPosition = 3 
    self.addChild(conformationScreenTextYes) 

    let conformationScreenTextNo = SKLabelNode(fontNamed: "The Bold Font") 
    conformationScreenTextNo.text = "No" 
    conformationScreenTextNo.fontSize = 150 
    conformationScreenTextNo.fontColor = SKColor.red 
    conformationScreenTextNo.position = CGPoint(x: self.size.width*0.70, y: self.size.height*0.30) 
    conformationScreenTextNo.zPosition = 3 
    self.addChild(conformationScreenTextNo) 


} 



override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    for touch: AnyObject in touches{ 

     let pointOfTouch = touch.location(in: self) 
     let tappedNode = atPoint(pointOfTouch) 
     let tappedNodeName = tappedNode.name 


     if tappedNodeName == "nextShipClick"{ 

      let sceneToMoveTo = ShopPage2(size: self.size) 
      sceneToMoveTo.scaleMode = self.scaleMode 
      let myTransition = SKTransition.fade(withDuration: 0.5) 
      self.view!.presentScene(sceneToMoveTo, transition: myTransition) 
     } 

     if tappedNodeName == "backToMainMenuButton"{ 

      let sceneToMoveTo = MainMenuScene(size: self.size) 
      sceneToMoveTo.scaleMode = self.scaleMode 
      let myTransition = SKTransition.fade(withDuration: 0.5) 
      self.view!.presentScene(sceneToMoveTo, transition: myTransition) 
     } 




    } 

} 

} 
+1

有什么问题在这里和问题是什么?顺便说一句,你的结论是错误的。您不要将子视图添加到场景中。您可以为它添加节点。在UIKit中,您可以将子视图添加到其他视图。 – Whirlwind

我有想出了如何让构造屏幕工作。感谢@AlessandroOrnano提供的所有帮助!我附上了我的代码以供将来参考。如果任何人有更有效的方式做到这一点,我将不胜感激任何建议。

import Foundation 
import SpriteKit 

class ShopPage1: SKScene{ 


override func didMove(to view: SKView) { 

    let background = SKSpriteNode(imageNamed: "background") 
    background.position = CGPoint(x: self.size.width/2, y: self.size.height/2) 
    background.zPosition = 0 
    self.addChild(background) 

    let balance = SKLabelNode(fontNamed: "The Bold Font") 
    balance.text = "$\(balanceAmount)" 
    balance.fontSize = 100 
    balance.fontColor = SKColor.green 
    balance.position = CGPoint(x: self.size.width/2, y: self.size.height*0.87) 
    balance.zPosition = 1 
    self.addChild(balance) 

    let backToMainMenuButton = SKSpriteNode(imageNamed: "backButton2") 
    backToMainMenuButton.position = CGPoint(x: self.size.width*0.25, y: self.size.height*0.89) 
    backToMainMenuButton.zPosition = 1 
    backToMainMenuButton.size = CGSize(width: 200, height: 200) 
    backToMainMenuButton.name = "backToMainMenuButton" 
    self.addChild(backToMainMenuButton) 

    let shipNameLabel = SKLabelNode(fontNamed: "The Bold Font") 
    shipNameLabel.text = "Stealth" 
    shipNameLabel.fontSize = 200 
    shipNameLabel.fontColor = SKColor.white 
    shipNameLabel.position = CGPoint(x: self.size.width/2, y: self.size.height*0.60) 
    shipNameLabel.zPosition = 1 
    shipNameLabel.name = "shipNameLabel" 
    self.addChild(shipNameLabel) 

    let nextShipButton = SKSpriteNode(imageNamed: "nextShipButton1") 
    nextShipButton.position = CGPoint(x: self.size.width*0.75, y: self.size.height*0.40) 
    nextShipButton.zPosition = 1 
    nextShipButton.size = CGSize(width: 300, height: 300) 
    nextShipButton.name = "nextShipButton" 
    self.addChild(nextShipButton) 


    let nextShipClick = SKLabelNode(fontNamed: "The Bold Font") 
    nextShipClick.text = "▲" 
    nextShipClick.fontSize = 300 
    nextShipClick.fontColor = UIColor.clear 
    nextShipClick.position = CGPoint(x: self.size.width*0.753, y: self.size.height*0.36) 
    nextShipClick.zPosition = 2 
    nextShipClick.name = "nextShipClick" 
    self.addChild(nextShipClick) 


    let shipForSale = SKSpriteNode(imageNamed: "playerShip4") 
    shipForSale.position = CGPoint(x: self.size.width/2, y: self.size.height*0.40) 
    shipForSale.zPosition = 1 
    shipForSale.size = CGSize(width: 150, height: 300) 
    self.addChild(shipForSale) 

    let shipPodium = SKSpriteNode(imageNamed: "shipPodium") 
    shipPodium.position = CGPoint(x: self.size.width*0.527, y: self.size.height*0.31) 
    shipPodium.zPosition = 1 
    shipPodium.size = CGSize(width: 1200, height: 70) 
    self.addChild(shipPodium) 

    let shipsCostLabel = SKLabelNode(fontNamed: "The Bold Font") 
    shipsCostLabel.text = "$500" 
    shipsCostLabel.fontSize = 200 
    shipsCostLabel.fontColor = SKColor.white 
    shipsCostLabel.position = CGPoint(x: self.size.width/2, y: self.size.height*0.20) 
    shipsCostLabel.zPosition = 1 
    self.addChild(shipsCostLabel) 

    let shipBuyButton = SKSpriteNode(imageNamed: "shipBuyButton") 
    shipBuyButton.position = CGPoint(x: self.size.width*0.54, y: self.size.height*0.15) 
    shipBuyButton.zPosition = 1 
    shipBuyButton.size = CGSize(width: 1500, height: 900) 
    shipBuyButton.name = "shipBuyButton" 
    self.addChild(shipBuyButton) 

    let shipBuyButtonClick = SKLabelNode(fontNamed: "The Bold Font") 
    shipBuyButtonClick.text = "▅▅" 
    shipBuyButtonClick.fontSize = 300 
    shipBuyButtonClick.fontColor = UIColor.clear 
    shipBuyButtonClick.position = CGPoint(x: self.size.width/2, y: self.size.height*0.05) 
    shipBuyButtonClick.zPosition = 2 
    shipBuyButtonClick.name = "shipBuyButtonClick" 
    self.addChild(shipBuyButtonClick) 

} 



override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    for touch: AnyObject in touches{ 

     let pointOfTouch = touch.location(in: self) 
     let tappedNode = atPoint(pointOfTouch) 
     let tappedNodeName = tappedNode.name 


     if tappedNodeName == "nextShipClick"{ 

      let sceneToMoveTo = ShopPage2(size: self.size) 
      sceneToMoveTo.scaleMode = self.scaleMode 
      let myTransition = SKTransition.fade(withDuration: 0.5) 
      self.view!.presentScene(sceneToMoveTo, transition: myTransition) 
     } 

     if tappedNodeName == "backToMainMenuButton"{ 

      let sceneToMoveTo = MainMenuScene(size: self.size) 
      sceneToMoveTo.scaleMode = self.scaleMode 
      let myTransition = SKTransition.fade(withDuration: 0.5) 
      self.view!.presentScene(sceneToMoveTo, transition: myTransition) 
     } 

     if tappedNodeName == "shipBuyButtonClick"{ 

      let sceneToMoveTo = ShopPage1ConformationScreen(size: self.size) 
      sceneToMoveTo.scaleMode = self.scaleMode 
      let myTransition = SKTransition.fade(withDuration: 0.5) 
      self.view!.presentScene(sceneToMoveTo, transition: myTransition) 
      } 

    } 

} 

} 

这是ShopPage1ConformationScreen代码:

import Foundation 
import SpriteKit 


let shipForSale = SKSpriteNode(imageNamed: "playerShip4") 

class ShopPage1ConformationScreen: SKScene{ 


override func didMove(to view: SKView) { 

    let background = SKSpriteNode(imageNamed: "background") 
    background.position = CGPoint(x: self.size.width/2, y: self.size.height/2) 
    background.zPosition = 0 
    self.addChild(background) 

    let balance = SKLabelNode(fontNamed: "The Bold Font") 
    balance.text = "$\(balanceAmount)" 
    balance.fontSize = 100 
    balance.fontColor = SKColor.green 
    balance.position = CGPoint(x: self.size.width/2, y: self.size.height*0.87) 
    balance.zPosition = 1 
    self.addChild(balance) 

    let backToMainMenuButton = SKSpriteNode(imageNamed: "backButton2") 
    backToMainMenuButton.position = CGPoint(x: self.size.width*0.25, y: self.size.height*0.89) 
    backToMainMenuButton.zPosition = 1 
    backToMainMenuButton.size = CGSize(width: 200, height: 200) 
    backToMainMenuButton.name = "backToMainMenuButton" 
    self.addChild(backToMainMenuButton) 

    let shipNameLabel = SKLabelNode(fontNamed: "The Bold Font") 
    shipNameLabel.text = "Stealth" 
    shipNameLabel.fontSize = 200 
    shipNameLabel.fontColor = SKColor.white 
    shipNameLabel.position = CGPoint(x: self.size.width/2, y: self.size.height*0.60) 
    shipNameLabel.zPosition = 1 
    shipNameLabel.name = "shipNameLabel" 
    self.addChild(shipNameLabel) 

    let nextShipButton = SKSpriteNode(imageNamed: "nextShipButton1") 
    nextShipButton.position = CGPoint(x: self.size.width*0.75, y: self.size.height*0.40) 
    nextShipButton.zPosition = 1 
    nextShipButton.size = CGSize(width: 300, height: 300) 
    nextShipButton.name = "nextShipButton" 
    self.addChild(nextShipButton) 


    let nextShipClick = SKLabelNode(fontNamed: "The Bold Font") 
    nextShipClick.text = "▲" 
    nextShipClick.fontSize = 300 
    nextShipClick.fontColor = UIColor.clear 
    nextShipClick.position = CGPoint(x: self.size.width*0.753, y: self.size.height*0.36) 
    nextShipClick.zPosition = 2 
    nextShipClick.name = "nextShipClick" 
    self.addChild(nextShipClick) 



    shipForSale.position = CGPoint(x: self.size.width/2, y: self.size.height*0.40) 
    shipForSale.zPosition = 1 
    shipForSale.size = CGSize(width: 150, height: 300) 
    self.addChild(shipForSale) 

    let shipPodium = SKSpriteNode(imageNamed: "shipPodium") 
    shipPodium.position = CGPoint(x: self.size.width*0.527, y: self.size.height*0.31) 
    shipPodium.zPosition = 1 
    shipPodium.size = CGSize(width: 1200, height: 70) 
    self.addChild(shipPodium) 

    let shipsCostLabel = SKLabelNode(fontNamed: "The Bold Font") 
    shipsCostLabel.text = "$500" 
    shipsCostLabel.fontSize = 200 
    shipsCostLabel.fontColor = SKColor.white 
    shipsCostLabel.position = CGPoint(x: self.size.width/2, y: self.size.height*0.20) 
    shipsCostLabel.zPosition = 1 
    self.addChild(shipsCostLabel) 

    let shipBuyButton = SKSpriteNode(imageNamed: "shipBuyButton") 
    shipBuyButton.position = CGPoint(x: self.size.width*0.54, y: self.size.height*0.15) 
    shipBuyButton.zPosition = 1 
    shipBuyButton.size = CGSize(width: 1500, height: 900) 
    shipBuyButton.name = "shipBuyButton" 
    self.addChild(shipBuyButton) 

    let conformationBackground = SKSpriteNode(imageNamed: "conformationBackground") 
    conformationBackground.position = CGPoint(x: self.size.width*0.51, y: self.size.height*0.40) 
    conformationBackground.zPosition = 2 
    conformationBackground.size = CGSize(width: 1300, height: 1400) 
    conformationBackground.name = "conformationBackground" 
    self.addChild(conformationBackground) 

    let conformationScreenTextTop = SKLabelNode(fontNamed: "The Bold Font") 
    conformationScreenTextTop.text = "Are you sure you wish to" 
    conformationScreenTextTop.fontSize = 80 
    conformationScreenTextTop.fontColor = SKColor.white 
    conformationScreenTextTop.position = CGPoint(x: self.size.width/2, y: self.size.height*0.46) 
    conformationScreenTextTop.zPosition = 3 
    conformationScreenTextTop.name = "comformationScreenTextTop" 
    self.addChild(conformationScreenTextTop) 

    let conformationScreenTextBottom = SKLabelNode(fontNamed: "The Bold Font") 
    conformationScreenTextBottom.text = "purchase this ship?" 
    conformationScreenTextBottom.fontSize = 80 
    conformationScreenTextBottom.fontColor = SKColor.white 
    conformationScreenTextBottom.position = CGPoint(x: self.size.width/2, y: self.size.height*0.41) 
    conformationScreenTextBottom.zPosition = 3 
    conformationScreenTextBottom.name = "conformationScreenTextBottom" 
    self.addChild(conformationScreenTextBottom) 

    let conformationScreenTextYes = SKLabelNode(fontNamed: "The Bold Font") 
    conformationScreenTextYes.text = "Yes" 
    conformationScreenTextYes.fontSize = 150 
    conformationScreenTextYes.fontColor = SKColor.green 
    conformationScreenTextYes.position = CGPoint(x: self.size.width*0.30, y: self.size.height*0.30) 
    conformationScreenTextYes.zPosition = 3 
    conformationScreenTextYes.name = "conformationScreenTextYes" 
    self.addChild(conformationScreenTextYes) 

    let conformationScreenTextNo = SKLabelNode(fontNamed: "The Bold Font") 
    conformationScreenTextNo.text = "No" 
    conformationScreenTextNo.fontSize = 150 
    conformationScreenTextNo.fontColor = SKColor.red 
    conformationScreenTextNo.position = CGPoint(x: self.size.width*0.70, y: self.size.height*0.30) 
    conformationScreenTextNo.zPosition = 3 
    conformationScreenTextNo.name = "conformationScreenTextNo" 
    self.addChild(conformationScreenTextNo) 
} 


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    for touch: AnyObject in touches{ 

     let pointOfTouch = touch.location(in: self) 
     let tappedNode = atPoint(pointOfTouch) 
     let tappedNodeName = tappedNode.name 

     if(balanceAmount >= 500){ 
     if tappedNodeName == "conformationScreenTextYes"{ 
      player = shipForSale 
      balanceAmount -= 500 
      let sceneToMoveTo = ShopPage1(size: self.size) 
      sceneToMoveTo.scaleMode = self.scaleMode 
      let myTransition = SKTransition.fade(withDuration: 0.5) 
      self.view!.presentScene(sceneToMoveTo, transition: myTransition) 
     } 
     } 

     if tappedNodeName == "conformationScreenTextNo"{ 
      let sceneToMoveTo = ShopPage1(size: self.size) 
      sceneToMoveTo.scaleMode = self.scaleMode 
      let myTransition = SKTransition.fade(withDuration: 0.5) 
      self.view!.presentScene(sceneToMoveTo, transition: myTransition) 
     } 



    } 
} 
} 

有关其他店铺的网页只是复制和粘贴这些代码集。除了将点击节点更改为您希望在页面之间移动的正确顺序之外。

如旋风在他的评论中说,你可以创建一个SKNode到场景的中心(位置CGPoint.zero)用你所有的东西做准备和隐藏它的alpha属性设置为0,并将它的zPosition设置为-1(在场景的所有其他可见节点下)。

所以,当你按钮被按下,你只需更改zPosition一个最高值和alpha,以1:为了更真实的动作,这些是你可以使用一些动画,如:

extension UIView { 
    func fadeIn(_ duration:TimeInterval=1.0) { 
     UIView.animate(withDuration: duration, delay: 0.0, options: UIViewAnimationOptions.curveEaseIn, animations: { 
      self.alpha = 1.0 // Instead of a specific instance of, say, birdTypeLabel, we simply set [thisInstance] (ie, self)'s alpha 
     }, completion: nil) 
    } 
    func fadeOut(_ duration:TimeInterval=1.0) { 
     UIView.animate(withDuration: duration, delay: 0.0, options: UIViewAnimationOptions.curveEaseOut, animations: { 
      self.alpha = 0.0 
     }, completion: nil) 
    } 
} 
+0

我想将这四个精灵和标签节点添加到节点,我该怎么做呢? conformationBackground,conformationScreenTextTop,conformationScreenTextBottom,conformationScreenTextNo – Jfost99

+0

当你说你所有的东西究竟是如何做到我这样做,它准备更好的问题。 – Jfost99

+1

@ Jfost99我想:如果你“从你的手”有写这些代码,我想你不会有任何问题,做让MYNODE = SKNode(); addChild(myNode); myNode.position = CGPoint.zero; myNode.zPosition = 1000 //将你想要的元素添加到myNode。那么你不会添加什么比在这个答案 –