[英]SpriteKit SKAction doesn't work after removing and readding a node
一天以來我一直在用頭撞這個,我真的不知道發生了什么。
我有一個非常簡單的設置:一個 SKNode(我們稱之為 base),它包含另一個 SKNode(sub-base),以及幾個 SKShapeNode 對象。 有時,我將 SKShapeNode 對象之一(使用 removeFromParent)從基節點移動到子基節點。 然后我應用 SKAction,它將節點移動到某個任意位置。
但是,當 SKShapeNode 被刪除並添加到子基礎對象時,SKAction 不起作用。 如果我將它從底座中取出,然后放回底座中,SKActions 將再次起作用。
我完全被難住了。 當一個節點被添加到另一個節點時,是否有一些屬性會被設置在一個節點上,當我刪除它時它沒有被正確重置......? 我無法想象這是應該發生的事情。
任何想法都會非常受歡迎。
更新:
這是我可以使用的一些代碼。 此函數位於 SKNode 的子類中。 該類添加了一堆 SKShapeNode,並且它還有另一個名為 testNode 的 SKNode,所以,不用多說:
-(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];
}
另一個更新!
我剛剛發現,如果我在節點位於 testNode 內部時將 SKAction 添加到節點,然后將其從 testNode 中刪除並將其添加回其原始父節點,則該操作將被激活。 比如,我在這里錯過了什么? 這一定是某種設計行為,我只是沒有正確使用..
這似乎是 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
}
}
我也在我的 SpriteKit 項目中看到了這個問題。 就我而言,我正在從我在場景編輯器中創建的 SKScene 文件中刪除一個節點,並將其添加到我當前的場景中。
經過一些調試,它表明這些操作根本沒有運行。 經過進一步調查,我發現了原因……似乎當您以這種方式向場景中添加節點時, isPaused
屬性設置為true
。 這是故意的還是錯誤,我無法確定。
來自文檔: https : //developer.apple.com/documentation/spritekit/sknode/1483113-ispaused
已暫停
如果該值為真,則在場景處理動作時會跳過該節點(及其所有后代)。
因此,為了“修復”這個問題,在節點上運行任何 SKActions 之前,取消暫停節點:
node.isPaused = false
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.