2017-02-14 76 views
2

如果我在節點上創建SKSpriteNode並運行SKAction,則該操作將在模擬器上運行,但該節點的屬性未更改。 例如在下面的例子中,在模擬器中,節點從(50,50)開始並在1秒內移動到(0,0)。然而,在最後打印的打印語句(50,50),而不是新的位置(0,0)Xcode SpriteKit SKAction不改變SKSpriteNode的屬性?

let test = SKSpriteNode() 

test.position = CGPoint(x: 50.0, y: 50.0) 
test.size = CGSize(width: 20.0, height: 20.0) 
test.color = UIColor.black 
addChild(test) 

test.run(SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0)) 
print("(\(test.position.x), \(test.position.y))") 

我能想到的唯一理由是,在執行之前SKAction print語句執行。如果是這種情況,那麼我該如何執行後面的代碼才能獲取SKSpriteNode的位置值?

+0

您不需要添加更多'SKAction'來打印位置 –

回答

1

節點的初始位置在它移動到所需的位置之前被打印出來,你需要做的是當節點到達你想要的位置時打印它的位置。

您可以用序列修復它類似如下:

let test = SKSpriteNode() 
test.position = CGPoint(x: 50.0, y: 50.0) 
test.size = CGSize(width: 20.0, height: 20.0) 
test.color = UIColor.red 
addChild(test) 

let moveAction = SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0) 
let printAction = SKAction.run { 
    print("(\(test.position.x), \(test.position.y))") 
} 
let sequence = SKAction.sequence([moveAction, printAction]) 

test.run(sequence) 

It's已經測試過,希望它可以幫助

GOOD LUCK !! :]

+0

謝謝!這正是我一直在尋找的! –

+0

真棒!很高興提供幫助。 –

1

我能想到的唯一原因是print語句在執行SKAction之前執行。

你完全正確!

那麼我該如何執行後面的代碼,它依賴於獲取SKSpriteNode的位置值?

通過組合SKAction.sequenceSKAction.run方法調用。

sequence方法返回一個動作,該動作包含一系列依次運行的動作。

run方法返回一個動作,它在運行時執行您傳入的代碼塊作爲參數。

您想打印的「移動」結束後的位置,所以創建這樣一個動作:

let runCodeAction = SKAction.run { 
    print("(\(test.position.x), \(test.position.y))") 
} 

然後,創建行動順序使用sequence

let sequence = SKAction.sequence(
    [SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0), runCodeAction]) 

現在運行這個序列:

test.run(sequence) 
3

在SpriteKit中,SKAction類有m任何實例方法,但您不需要添加更多的代碼,如SKAction.sequence和另一個SKAction來打印您的位置。

其實你有run(_:completion),你可以找到的官方文檔here

有一個名爲完成塊時的動作完成

所以你的代碼完成的是,只需添加完成語法如下:

test.run(SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0), completion:{ 
    print("(\(test.position.x), \(test.position.y))") 
}) 
相關問題