簡體   English   中英

刪除和讀取節點后,SpriteKit SKAction 不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM