2016-01-17 70 views
0

我是一個noob,所以,如果這是一個非常基本的問題,請原諒我。 我正在創建我的第一個應用程序,它是一個遊戲。代碼對於一個文件而言變得太大了(令人討厭的是始終在上下)。所以我把我的功能放在其他文件上。 問題是,addChild不能從其他文件中工作。在我的遊戲中,當玩家停在某個特定的地方時,必須調用一個節點。如果函數位於「GameScene.swift」文件中,它可以很好地工作,但是如果該函數位於其他任何swift文件中,則該節點將被調用,但不會顯示。我知道這個對象是被調用的,因爲如果玩家第二次碰到同一個地方,那麼遊戲崩潰時會顯示一條消息,說我正在試圖投射一個已經投射過的對象。如何從GameScene以外的其他文件轉換節點?

我想調用的節點放置在Struct中,因此可以從我的代碼的任何部分訪問。

有一種合適的方法來從其他文件轉換節點?

一個例子說清楚。波紋管代碼很好地工作。我觸摸廣場和其他方塊出現

 

    // GameScene.swift 
// teste1 

import SpriteKit 

struct myStruct { 

static let myNode : SKShapeNode = SKShapeNode(rectOfSize: (CGSizeMake(100,100)), cornerRadius: 5) 
static let myGameScene = GameScene() 

} 

class GameScene: SKScene { 

override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 

     myStruct.myNode.position = CGPoint(x:(CGRectGetMidX(self.frame)), y:(CGRectGetMidY(self.frame)) + 150) 
     myStruct.myNode.fillColor = SKColor.redColor() 

     let button : SKShapeNode = SKShapeNode(rectOfSize: (CGSizeMake(100,100)), cornerRadius: 5) 
     button.position = CGPoint(x:(CGRectGetMidX(self.frame)), y:(CGRectGetMidY(self.frame))) 
     button.fillColor = SKColor.greenColor() 
     button.name = "button" 

     addChild(button) 



    } // end DidMoveToView 


    func addNode() { 

    addChild(myStruct.myNode) 

    } 

    override func touchesBegan(touches: Set, withEvent event: UIEvent?) { 


     let touch = touches //as! Set 
     let location = touch.first!.locationInNode(self) 
     let node = self.nodeAtPoint(location) 

     // +++ BUTTON: DICE +++ 
     if (node.name == "button") { 

      addNode() 
     } 
    } 

} //end GameScene 



但是不可能從其他文件做同樣的事情。比方說,我的功能ADDNODE()轉讓給其他快捷文件是這樣的:

 

    // otherFile.swift 
// teste1 


import SpriteKit 

func addNode() { 

    myStruct.myGameScene.addChild(myStruct.myNode) 

} 

當我觸碰「按鈕」指出發生,但如果我摸了第二次:

 

    2016-01-17 09:54:54.641 teste1[954:24089] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent: name:'(null)' accumulatedFrame:{{460.64999, 482.64999}, {102.7, 102.7}}' 
*** First throw call stack: 

回答

0

您使用您的結構中元素的static關鍵字。這意味着您的應用程序中只有一個元素實例(它始終是同一個對象)。這會導致您再次將相同的節點添加到相同的場景。

+0

我明白這一點。它始終是相同的對象,並且在遊戲中,我會每次「addChild」和「removeFromParent」。 這裏的問題是,我不能在GameScene.swift以外的其他文件上使用addChild。節點已添加,但未顯示在屏幕上。 如何在其他文件的函數中使用addChild?現在我正在使用「隱藏」來使對象出現和消失,但是我有很多這樣的情況,並且必須在開始時調用所有節點以允許我取消隱藏它們。我並不需要所有的節點,一次只需要一個節點,所以addChild看起來更好。 – FernandoRosa

相關問題