我们创建加载到场景的精灵节点的方式如下:
var createNode: SKNode!
In viewDidLoad:
createNode = createNode1
addChild(createNode)
然后沿着这条线进一步我们有一个创建这个节点的方法,如:
func createNode1 () -> SKNode {
// load and create node here
{
假设我们使用init()方法或初始化器创建相同的节点,而不是我们在上面的方法createNode1
中创建的节点。它会有什么不同。我的目的是在我的应用程序中使用这个相同的节点。
答案 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类中创建了精灵节点nodeA1
和nodeA2
属性,并使用CGRectGetMidX
和CGRectGetMidY
将这两个节点添加到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扩展,我可以使用单个函数使用CGPathMoveToPoint
和CGPathAddLineToPoint
从一个点到另一个点绘制线条,如上所示,适用于任何设备(iPad和/或iPhone)
总结!
注意我使用线条图只是一个示例,但同样的方法可以在您自己的应用程序设计中使用。这里的想法是使用扩展并且只有一个函数/方法获得可在任何设备上工作的节点位置。
这仍然是在我们的应用程序中使用扩展程序的正确方法吗?谢谢!