2017-02-14 69 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))") 
})