2016-03-08 46 views
1

創建spritenodes我們創建了被加載到現場精靈節點的方式如下:一般用在SpriteKit遊戲初始化爲雨燕

var createNode: SKNode! 

In viewDidLoad: 
createNode = createNode1 
addChild(createNode) 

然後進一步沿線我們創建此方法節點如:

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

比方說,我們創建一個使用init()方法或初始化而不是我們在方法createNode1上面這樣做相同的節點。它會有什麼不同。我使用的目的是在我的應用程序中使用同一個節點。

回答

0

比方說,我創建了以下SKNode擴展斯威夫特在一個迅速類(即NodeExtensions.swift)。

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中添加了這兩個節點場景以指定位置。

// 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等)。

綜上所述!

  1. 創建SKNode擴展名。
  2. 在場景中創建並添加兩個節點(即,對於此線條繪製示例)。
  3. 使用擴展時,請在您的函數/方法中指定每個節點的使用方式,如上例所示。

注意我使用的只是一個示例,但可以在您自己的應用程序設計中使用同樣的方法。這裏的想法是使用擴展,並且只有一個功能/方法可以獲得適用於任何設備的節點位置。

這是否仍然是貫徹我們的應用程序使用擴展的正確方法?謝謝!

2

我也可以幫你這一個了。

的主要區別是,如果你只需要創建一個功能

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

比所有你能做的就是在該方法什麼,如創建節點。

let node1 = createNode1() 
    addChild(node1) 

在另一方面,如果你會使用一個子類,你可以創建特定的節點,你比可以在場景中創建的節點方便地調用方法/屬性。

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等實例訪問特定節點的方法/屬性。

因此,在總結,如果你只需要渲染節點,不是別的,你可能只保留該功能。

不過,如果您有相關該字符的具體方法,我相信你做的,應該比你繼承,因爲它使得它的意圖你的代碼更清晰,只是一般的清潔劑。

是這個回答你的問題?

+0

完美的解釋,是的,它有助於,再次,超級解釋。謝謝。 –

+0

我的榮幸。不要猶豫問更多的問題,這就是堆棧溢出是什麼,只要你張貼你正在嘗試的代碼。快樂的編碼。 – crashoverride777

+0

我的朋友。由於您熟悉我當前使用baseScene創建10個節點並使用此baseScene繼承其他30個類的過程。如果我來到一個不需要node1但需要其他九個節點的子類,我可以只使用'node1.removeFromParent'嗎?我試了一下,它的工作原理,但我想確保這是避免在不需要此節點的場景中使用此節點的正確方法。謝謝。 –