2015-03-31 15 views
2

我想要做一個無限循環與我SKSpriteNodes/SKNode,但循環無法正常工作。斯威夫特雪碧套件通話功能再次

給你我的遊戲的想法,有2個長的目標,在屏幕的底側,並與它們其間的空隙彼此相鄰催生。 兩個目標之間是contactNode,它決定如果玩家穿過牆壁或沒有,得分點。 目標無限生成。

比賽開始後,它會調用函數addObjectives。一個小的延遲之後,我想再次調用相同的功能,新的節點,而舊催生了一個仍然存在,並移動到用新的頂部。

但是用我的代碼,在節點到達Update:給定的點後,它們停止,場景再次調用函數,新節點移動到該點並再次停止。一個無限循環。

我不想在addObjectives被再次調用後停止節點,它們應該從屏幕的底部產生並移動到頂部,然後被移除,同時總是會從底部產生新的目標。

我該怎麼做?

... 
var contactNode = SKNode() 
... 

func addObjectives(){ 

    O1 = SKSpriteNode(imageNamed: "Objective.png") 
    O1.size = CGSize(width: self.frame.size.width/1.3, height: self.frame.size.height/17) 
    O1.position = positions[randomPosition()] 
    O1.zPosition = 3 

    ... 

    self.addChild(O1) 

    O2 = SKSpriteNode(imageNamed: "Objective.png") 
    O2.size = CGSize(width: self.frame.size.width/1.3, height: self.frame.size.height/17) 
    O2.position = CGPoint(x: O1.position.x + CGFloat(Gap), y: O1.position.y) 
    O2.zPosition = 3 

    ... 

    self.addChild(O2) 

    contactNode.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: CGFloat(Gap)/2, height: O1.size.height)) 
    contactNode.position = CGPoint(x: O1.position.x + (CGFloat(Gap)/2), y: O1.position.y - 20) 
    contactNode.physicsBody?.dynamic = false 
    contactNode.physicsBody?.categoryBitMask = ScoreCategory 
    contactNode.physicsBody?.contactTestBitMask = PlayerCategory 
    contactNode.physicsBody?.collisionBitMask = 0 

    self.addChild(contactNode) 
} 

//Called in the Update Method 

func ScrollingMauer(){ 

    O1.position = CGPointMake(O1.position.x, O1.position.y + Speed) 
    O2.position = CGPointMake(O2.position.x, O2.position.y + Speed) 
    contactNode.position = CGPointMake(contactNode.position.x, contactNode.position.y + Speed) 

    if(O1.position.y > self.frame.size.height + O1.size.height) 
    { 
     O1.removeFromParent() 
    } 

    if(O2.position.y > self.frame.size.height + O2.size.height) 
    { 
     O2.removeFromParent() 
    } 

    if(contactNode.position.y > self.frame.size.height + Mauer2.size.height) 
    { 
     contactNode.removeFromParent() 
    } 

    // Here the Function is called again, but the previous spawned 
    Objectives stop and the new Objectives come from the bottom to the top. 

    if(O1.position.y > self.frame.size.height/3) 
    { 
     self.addObjectives() 
    } 

} 

回答

1

你得到,因爲contactNode錯誤已經被添加到場景所以加入它,因爲contactNode已經有母再次將產生這個錯誤。

你可以使用一個布爾值標誌指示已添加的節點,然後添加它只有一次:

contactNode.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: CGFloat(Gap)/2, height: O1.size.height)) 
    contactNode.position = CGPoint(x: O1.position.x + (CGFloat(Gap)/2), y: O1.position.y - 20) 
    contactNode.physicsBody?.dynamic = false 
    contactNode.physicsBody?.categoryBitMask = ScoreCategory 
    contactNode.physicsBody?.contactTestBitMask = PlayerCategory 
    contactNode.physicsBody?.collisionBitMask = 0 

    if !self.contactNodeAdded { 
     self.addChild(contactNode) 
     self.contactNodeAdded = true 
    } 

,並在您ScrollingMauer方法:

if(contactNode.position.y > self.frame.size.height + Mauer2.size.height) 
    { 
     contactNode.removeFromParent() 
     self.contactNodeAdded = false 
    } 

(你也可以搜索節點但效率會降低,尤其是在每幀更新時被調用)

編輯: 如果你想爲每個聯繫人節點的新實例創建一個:

contactNode = SKNode() 
// set physics body etc.. 
contactNodesArray.append(contactNode) 

要跟蹤這些實例(用於日後刪除它們)將其存儲在一個數組,並檢查陣列的每個實例,你在做刪除接點節點邏輯:

let nodesToRemoveArray: Array<Int> = Array(); 
for (index, node) in enumerate(contactNodesArray) { 
    if(node.position.y > self.frame.size.height + Mauer2.size.height) 
    { 
     node.removeFromParent() 
     nodesToRemoveArray.append(index); 
    } 
} 

for indexToRemove in nodesToRemoveArray { 
    contactNodesArray.removeATIndex(indexToRemove) 
} 
+0

非常感謝您的回答!但我不想只添加contactNode一次,它應該總是與其他2個SpriteNode一起添加。另外,如何在不停止添加的舊目標的情況下再次調用函數'addObjectives'? 我更新我的帖子並添加遊戲理念來澄清項目。 – Albert 2015-04-02 12:56:59

+0

那麼爲什麼不在設置其屬性之前創建聯繫節點呢? – giorashc 2015-04-02 13:12:12

+0

這不正是我所做的?我創建contactNode的目標是將它們移到一起。 contactNode是一個簡單的SKNode,只有一個physicsBody。如果我誤解了你,請爲我澄清! – Albert 2015-04-02 13:16:22