我有3个节点阵列,每个阵列有5个节点。此示例中的节点是正方形。
我想使用touchesBegan和touchesEnded移动它们,保存用户触摸的阵列,然后保存手指从屏幕移开时的位置。我已经知道如何使用节点。
我的问题是我不知道如何告诉我的代码要移动什么数组,因为我不能使用像array.name这样的东西来区分我怎么能做这样的事情?
例如,如果我触摸我的Array1,他会检测到它是我的Array1,然后当我移开我的手指时,他会做一个SKAction来移动我的Array1中的节点。
我尝试使用array.description但是没有用。
感谢。
答案 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
}