SpriteKit游戏中初始化程序的一般用法,用于在Swift中创建spritenodes

时间:2016-03-08 17:45:57

标签: swift sprite-kit

我们创建加载到场景的精灵节点的方式如下:

var createNode: SKNode!

In viewDidLoad:
createNode = createNode1
addChild(createNode)

然后沿着这条线进一步我们有一个创建这个节点的方法,如:

func createNode1 () -> SKNode {
    // load and create node here 
{

假设我们使用init()方法或初始化器创建相同的节点,而不是我们在上面的方法createNode1中创建的节点。它会有什么不同。我的目的是在我的应用程序中使用这个相同的节点。

2 个答案:

答案 0 :(得分:2)

我也可以帮你解决这个问题。

主要区别在于,如果你只是创建函数

 createNode1(...) -> SKNode {....

你所能做的就是在那个方法中做什么,就像创建节点一样。

  let node1 = createNode1()
  addChild(node1)

另一方面,如果您要使用子类,则可以创建特定于该节点的方法/属性,您可以在创建节点的场景中轻松调用这些方法/属性。

e.g

 class Node: SKSpriteNode {

     var testBool = false

    init(....) {
    // node set up code

    }


 func test1() {
     // some code relevant to the node
 }

 func test2() {
   // some code relevant to the node
  } 
}

现在,在您创建节点的gameScene中,您可以调用这些方法或属性

 class GameScene: SKScene {

     var node1: Node!
     var node2: Node!

     didMoveToView........ {

     node1 = Node(...)
     addChild(node1)

     node2 = Node(...)
     addChild(node2)

     node1.test1()
     node1.test2()
     node1.testBool = true

     // you notice that I am only calling the methods for node 1, which means that node2 test func are not called yet and testBool is still false.

     // see the flexibility in this?
     // Main uses for this could be methods/properties for things such as animations, health,  etc
 }

如果你没有子类比那些方法/属性必须在你的GameScene中的某个地方,他们可能不应该真的是因为它们特定于那个节点而不是场景。您也无法添加多个节点,而是使用node1或node2等实例访问特定节点的方法/属性。

总而言之,如果您只需要渲染节点而不是其他任何东西,那么您可以保留该功能。

但是,如果您有与该角色相关的特定方法,并且我确信您这样做,那么您应该进行子类化,因为它会使您的代码更清晰,并且通常更清晰。

这是回答你的问题吗?

答案 1 :(得分:0)

假设我在一个swift类(即NodeExtensions.swift)中在Swift中创建了以下SKNode扩展。

extension SKNode {
  var x: CGFloat {
    get {
          return position.x 
    }
    set {
          position.x = newValue
    }
  }

  var y: CGFloat {
    get {
          return position.y 
    }
    set {
          position.y = newValue
    }
  }
}

然后在我的GameScene中:SKScene我创建了一个函数来绘制从一个点到另一个点的简单线,如下所示。注意我已经在此GameScene类中创建了精灵节点nodeA1nodeA2属性,并使用CGRectGetMidXCGRectGetMidY将这两个节点添加到viewDidLoad中具有指定位置的场景中。 / p>

// I first declare these globally in the class
let pathToDraw1 = CGPathCreateMutable()
let myLine1 = SKShapeNode()


// Then I create function below that uses pathToDraw1 and myLine1.
// Draw line from Node 1 to Node 2

func drawLine1to2() {
// Removes drawn line by enumerating the node with the name "line1"
enumerateChildNodesWithName("line1", usingBlock: {node, stop in node.removeFromParent()})

// Enumerate over this node
nodeA2.enumerateChildNodesWithName("A2_Broj", usingBlock: {node, stop in

    self.myLine1.name = "line1"

    CGPathMoveToPoint(self.pathToDraw1, nil, nodeA1.x, nodeA1.y) // From node
    CGPathAddLineToPoint(self.pathToDraw1, nil, nodeA2.x, nodeA2.y) // To node

    self.myLine1.path = self.pathToDraw1
    self.myLine1.strokeColor = SKColor.orangeColor()
    self.myLine1.zPosition = 2.0
    self.myLine1.lineWidth = 25

    self.addChild(self.myLine1)
})
}

使用SKNode扩展名中的x和y位置注意以下行。

    CGPathMoveToPoint(self.pathToDraw1, nil, nodeA1.x, nodeA1.y) // From node
    CGPathAddLineToPoint(self.pathToDraw1, nil, nodeA2.x, nodeA2.y) // To node

通过使用此SKNode扩展,我可以使用单个函数使用CGPathMoveToPointCGPathAddLineToPoint从一个点到另一个点绘制线条,如上所示,适用于任何设备(iPad和/或iPhone)

总结!

  1. 创建SKNode扩展名。
  2. 创建并向场景添加两个节点(即此行绘制示例)。
  3. 使用扩展时,请在函数/方法中指定使用每个节点的方法,如上例所示。
  4. 注意我使用线条图只是一个示例,但同样的方法可以在您自己的应用程序设计中使用。这里的想法是使用扩展并且只有一个函数/方法获得可在任何设备上工作的节点位置。

    这仍然是在我们的应用程序中使用扩展程序的正确方法吗?谢谢!