TouchBegan / TouchEnded with Array

时间:2015-07-09 21:52:13

标签: ios swift sprite-kit

我有3个节点阵列,每个阵列有5个节点。此示例中的节点是正方形。

我想使用touchesBegan和touchesEnded移动它们,保存用户触摸的阵列,然后保存手指从屏幕移开时的位置。我已经知道如何使用节点。

我的问题是我不知道如何告诉我的代码要移动什么数组,因为我不能使用像array.name这样的东西来区分我怎么能做这样的事情?

例如,如果我触摸我的Array1,他会检测到它是我的Array1,然后当我移开我的手指时,他会做一个SKAction来移动我的Array1中的节点。

我尝试使用array.description但是没有用。

感谢。

1 个答案:

答案 0 :(得分:1)

由于Sprite Kit提供了访问场景节点树中精灵的便捷方法,因此几乎没有理由使用数组来管理精灵节点。在这种情况下,您可以为精灵添加一组SKNode,因为您可以轻松访问精灵所在的“容器”node = sprite.parent。然后,您可以通过循环node.children来迭代该容器中的精灵。以下是如何执行此操作的示例:

var selectedNode:SKSpriteNode?

override func didMoveToView(view: SKView) {
    scaleMode = .ResizeFill

    let width = view.frame.size.width
    let height = view.frame.size.height

    let colors = [SKColor.redColor(), SKColor.greenColor(), SKColor.blueColor()]

    // Create 3 container nodes
    for i in 1...3 {
        let node = SKNode()
        // Create 5 sprites
        for j in 1...5 {
            let sprite = SKSpriteNode(imageNamed:"Spaceship")
            sprite.color = colors[i-1]
            sprite.colorBlendFactor = 0.5
            sprite.xScale = 0.125
            sprite.yScale = 0.125
            // Random location
            let x = CGFloat(arc4random_uniform(UInt32(width)))
            let y = CGFloat(arc4random_uniform(UInt32(height)))
            sprite.position = CGPointMake(x, y)
            // Add the sprite to a container
            node.addChild(sprite)
        }
        // Add the container to the scene
        addChild(node)
    }
}

选择要在touchesBegan

中移动的精灵
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    for touch in (touches as! Set<UITouch>) {
        let location = touch.locationInNode(self)
        let node = nodeAtPoint(location)
        selectedNode = node as? SKSpriteNode
    }
}

移动选定的精灵

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    for touch in (touches as! Set<UITouch>) {
        let location = touch.locationInNode(self)
        selectedNode?.position = location
    }
}

旋转包含所选精灵的节点中的所有子项

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let parent = selectedNode?.parent?.children {
        for child in parent {
            let action = SKAction.rotateByAngle(CGFloat(M_PI*2.0), duration: 2.0)
            child.runAction(action)
        }
    }
    selectedNode = nil
}