如何在一组具有相同名称的SKSpriteNodes上运行SKAction?

时间:2015-03-23 22:12:32

标签: swift sprite-kit skspritenode

我正在使用spriteKit和swift在Xcode 6中制作游戏。我现场有一架飞机,为了使它看起来像移动,我在屏幕左边的场景中创建了云。然后我们将SKAction移动到屏幕的右侧。这非常有效。然后单击以从平面上跳下,并且平面向上移动离开场景。然后我开始在场景的底部制作云,然后它们从场景的顶部向上移动,但问题是,已经存在的云仍然必须移动到屏幕的右侧。我的问题是,我如何做到这一点,以便所有现有的云停止他们的行动,使他们向右移动,然后开始准确向上移动?如何在创建现有云的同时访问它们?当你点击屏幕打开降落伞跳跃时我也希望云速度减慢,但这应该可以通过结束移动云的SKAction,然后在它们上使用另一个SKAction来移动它们更慢,但我不知道如何访问一组SKSpriteNodes。

以下是我制作云端的代码:

//This is how the cloud is first declared at the top of the .swift file
var cloud = SKSpriteNode()

//This is the function that runs every certain interval through an NSTimer
func createCloud()
{
    cloud = SKSpriteNode(imageNamed: "cloud")
    cloud.xScale = 1.25

    cloud.yScale = cloud.xScale/2
    cloud.zPosition = -1
    self.addChild(cloud)

    if personDidJump == false
    {
        let moveRight = SKAction.moveToX(CGRectGetWidth(self.frame) + CGRectGetWidth(cloud.frame), duration: cloudSpeed)
        var apple = CGRectGetWidth(self.frame)
        var randomNumber:CGFloat = CGFloat(arc4random_uniform(UInt32(apple)))
        cloud.position = CGPointMake(-CGRectGetWidth(cloud.frame), randomNumber)
        cloud.runAction(moveRight)
    }
    if personDidJump == true
    {
        let moveUp = SKAction.moveToY(CGRectGetHeight(self.frame) + CGRectGetWidth(cloud.frame), duration: cloudSpeed)
        var apple = CGRectGetWidth(self.frame)
        var randomNumber:CGFloat = CGFloat(arc4random_uniform(UInt32(apple)))
        cloud.position = CGPointMake(randomNumber, -CGRectGetHeight(cloud.frame))
        cloud.runAction(moveUp)
    }
}

另外,当他们离开现场时,我是否应该担心删除云?或者我可以把它们留在那里,因为你无法看到它们,而且从我所看到的,它们不会落后于你。 任何帮助将不胜感激。谢谢。

-Callum -

2 个答案:

答案 0 :(得分:0)

将您的云放入数组中。当您的播放器跳转时(或者当您需要移动它们时)运行阵列并在每个云上运行您的操作。

答案 1 :(得分:0)

stackoverflow.com/a/24213529/3402095

^这就是我发现我的回答^

当您创建节点时,请为其命名:

myNode.name = "A Node Name"
self.addChild(myNode)

如果有很多这些节点,稍后您可以在这些节点上更改属性或预先形成SKAcions,或使用enumerateChildNodesWithName执行您想要执行的操作:

self.enumerateChildNodesWithName("A Node Name")
{
    myNode, stop in 

    myNode.runAction(SKAction.moveToY(CGRectGetHeight(self.Frame), duration: 1)
}

我希望这对任何可能需要它的人都有用。