使用swift中的单个函数/方法向场景添加多个精灵节点

使用swift中的单个函数/方法向场景添加多个精灵节点,swift,nodes,Swift,Nodes,假设我有10个节点,其中所有节点都是点图像,node1到node10。我创建node1如下: func createNode1() -> SKNode { let spriteNode = SKNode() spriteNode.position = CGPointMake(CGRectGetMidX(self.frame)/1.35, CGRectGetMidY(self.frame)/1.32) let sprite = SKSpriteNode(imageNamed: "

假设我有10个节点,其中所有节点都是点图像,
node1到node10
。我创建
node1
如下:

func createNode1() -> SKNode {
  let spriteNode = SKNode()
  spriteNode.position = CGPointMake(CGRectGetMidX(self.frame)/1.35, CGRectGetMidY(self.frame)/1.32)
  let sprite = SKSpriteNode(imageNamed: "dot_1")
  sprite.zPosition = 3.0
  sprite.name = "A1_Dot"
  spriteNode.addChild(sprite)      
  return spriteNode
}

我通过再创建9个函数来创建其余的节点,其中下一个函数是
func createNode2
等,最多10个函数,它们之间的唯一区别是节点的名称和位置。基本上每个节点在场景中有不同的位置,当然还有不同的图像名称。是否有一种方法可以一次将10个节点加载到场景中,并在使用时操纵节点的位置。?我正在寻找一种方法,使用单个函数或方法将所有10个节点加载到场景中,并在同一个函数中指定节点的位置。谢谢。

您需要使用循环在位置数组中迭代,并将将将节点添加到场景的代码移动到循环中:

let positions = [CGPointMake(CGRectGetMidX(self.frame)/1.35, CGRectGetMidY(self.frame)/1.32), ... /*add your 9 other positions here*/]
positions.enumerate().forEach { (index, point) in
  let spriteNode = SKNode()
  spriteNode.position = point
  let sprite = SKSpriteNode(imageNamed: "dot_\(index + 1)")
  sprite.zPosition = 3.0
  sprite.name = "A\(index + 1)_Dot"
  spriteNode.addChild(sprite)      

  // Add spriteNode to the scene here
}

您可以按照Jugale的建议使用循环,也可以只将所需的值传递到方法中

比如说

    func createNode1(imageNamed imageNamed: String, name: String, pos: CGPoint) -> SKNode {
        let spriteNode = SKNode()
        spriteNode.position = pos
        let sprite = SKSpriteNode(imageNamed: imageNamed)
        sprite.zPosition = 3.0
       sprite.name = name
       spriteNode.addChild(sprite)      
        return spriteNode
   } 
现在,在场景中,可以像这样添加节点

 let node1Pos = ...
 node1 = createNode1(imageNamed: "...", name: "A1_Dot", pos: node1Pos)


 let node2Pos = ...
 node2 = createNode1(imageNamed: "...", name: "A1_Dot", pos: node2Pos)
我在create节点函数中说ImageNamed两次,因为当您将内容传递到函数中时,默认情况下Swift在调用方法时不需要键入第一个描述。(见下文) 所以如果你只说ImageName一次,你会这样称呼它

  node1 = createNode1("...", pos: node1Pos)
此外,还可以简化创建节点函数,除非您特别希望在方法中返回SKNode

   func createNode1(imageNamed imageNamed: String, name: String, pos: CGPoint) -> SKSpriteNode {

        let sprite = SKSpriteNode(imageNamed: imageNamed)
        sprite.position = pos
        sprite.zPosition = 3.0
       sprite.name = name
       addChild(sprite)      
        return sprite
   } 

任何一种方法都是可以接受的解决方案。以下是全部细节。在基本场景中,我们创建函数
createNodes
,并在
didMoveToView
中调用该函数,其中
nodeA1
位于给定位置,并添加到场景中,如下所示

override func didMoveToView(view: SKView) {
let nodeA1Pos = CGPointMake(CGRectGetMidX(self.frame)/1.5, CGRectGetMidY(self.frame)/2.0)
    nodeA1 = createNodes(imageNamed: "dot_1", name: "A1_Dot", pos: nodeA1Pos)
    addChild(nodeA1)
}
然后在Level1Scene中,它是baseScene的子类,我们只给
nodeA1
一个新位置,它将覆盖最初在baseScene中设置的位置:

override func didMoveToView(view: SKView) {
    super.didMoveToView(view)
    nodeA1.position = CGPointMake(CGRectGetMidX(self.frame)/1.3, CGRectGetMidY(self.frame)/0.67)
}
这种子类化方法节省了大量时间和代码,因为只有一个函数用于生成所有公共sprite节点


感谢Crashoveride777

这两个想法都很好。您还记得在其他帖子中,我使用BaseSecene加载我的所有10个节点和levelScene到level30Scene,其中所有30个场景都是BaseSecene的子类。每个leveXScene将在30个场景中的每个场景上放置例如node1的不同位置。我还会使用您在这里提到的这种方法为BaseSecene中的节点进行这样的设置吗?谢谢,朋友。关于这一方法,让我再问一件事。假设在BaseSecene中,我按照以下步骤创建节点1,然后在didMoveToView中的同一场景中,我执行“Let node1Pos=。。。node1=createNode1(图像名:“…”,名称:“A1_点”,位置:node1Pos)”。使用同一节点的下一步是Level1Scene,它是baseScene的子类。如果我必须更改节点1在Level1Scene子类中的位置,我将如何处理节点1?我只需要确认我对以下解决方案的回答是否正确。谢谢你之前问过我这个问题,你只需在场景中将节点的位置更改为你想要的位置(node1.position=…),是的,我做了。我只是有点迷路了。很好,长官!谢谢如何将其添加到函数中?谢谢嗨,我想我知道了!当你在上面的评论中说“//Add spriteNode to the scene here”时,你的意思是:self.addChild(spriteNode)当我以这种方式添加到场景中时,似乎所有节点都正确加载到场景中,但现在当我尝试在代码中使用sprite名称A(index+1)Dot时,我得到了错误“线程1:致命错误:隐式展开可选值时意外发现nil”