2013-10-31 78 views
2

我一直對此感到頭痛,我真的不知道發生了什麼。我有一個非常簡單的設置:一個SKNode(讓我們稱之爲基礎),其中包含另一個SKNode(子基礎),以及幾個SKShapeNode對象。在某個時候,我將其中一個SKShapeNode對象(使用removeFromParent)從基節點移動到子基節點。然後我應用SKAction,將節點移動到某個任意位置。SpriteKit SKAction在刪除並讀取節點後不起作用

除SKYction在SKShapeNode被移除並添加到子基礎對象時不起作用。如果我將它從底座上取下,然後放回底座,SKActions會再次工作。

我完全難住了。當一個節點被添加到另一個節點時,是否有一些屬性在節點上被設置,當我刪除它時沒有正確重置......?我無法想象這是應該發生的事情。

任何想法都會非常受歡迎。

更新:

下面是我可以使用它製作的一些代碼。這個函數在SKNode的子類中。類增加了大量SKShapeNodes的,它也有這個其他SKNode稱爲testNode,所以,事不宜遲:

-(void) removeThenAdd 
{ 
    [someNode removeFromParent]; 

    [self.testNode addChild:someNode]; 

    SKAction* action = [SKAction moveTo:CGPointMake(200, 200) duration:1]; 

    SKNode* thatSameNodeJustAdded = [self.testNode.children objectAtIndex:0]; 

    [thatSameNodeJustAdded runAction:action]; 
} 

另一個更新!

我剛剛發現,如果我將SKAction添加到節點,同時它坐在testNode內,然後將它從testNode中移出並將其添加回原始父級,則會激活該操作。比如,我在這裏錯過了什麼?這必須是某種設計的行爲,我只是不正確使用..

+0

顯示傳輸代碼和您運行的操作。我可以想象,移動動作是使用節點的原始位置(和父座標空間)進行初始化的,並且在「重新提供」節點時不更新其目標目標。 – LearnCocos2D

+0

我正在重新創建該操作,在某些情況下,在節點重新設置後很久以後,所以我猜它不可能是這樣?無論如何,我提出了一些代碼。 – debu

+0

當你說「它不工作」,你需要更具體。你有錯誤嗎?它不會移動你的期望?如果是這樣,告訴我們它究竟做了什麼,所以我們可以利用這些信息。這聽起來像也許這可能是關於你使用MoveTo,而不是期望SKNode工作不同,因爲它現在有一個新的座標空間。 200,200與原始父母一起,可能與新父母不在同一全球位置。如果可以,請更具體。 – prototypical

回答

0

這似乎是在SDK中的錯誤。我有這個問題,因爲我想在他們自己的場景文件中製作高級精靈(有子女,發射器等的精靈),這樣我就可以有選擇地加載,然後將它們添加到我的場景中。我想出了一個使用NSKeyedArchiver和NSKeyedUnarchiver的工作 - 將節點(或父節點)轉換爲數據,然後再回來,並且新對象已準備好添加到場景中,如果它是一個發射器或者有孩子發射器節點將全部複製並正確地重新添加。這是我爲swift製作的擴展,像一個魅力:

extension SKNode { 
    // Pulling a node from one scene and putting it into another causes some problems with broken emitters :(
    // Fix here is to archive and then unarchive the node before returning 
    class func nodeFromScene(nodeName : String, sceneFileName : String) -> SKNode? { 
     if let scene = SKScene(fileNamed: sceneFileName), node = scene.childNodeWithName(nodeName) { 
      let archive = NSKeyedArchiver.archivedDataWithRootObject(node) 
      return NSKeyedUnarchiver.unarchiveObjectWithData(archive) as? SKNode 
     } 
     return nil 
    } 
}