2016-12-13 1 views
3

Я хочу добавить действие для всех узлов на сцене, кроме одного или двух узлов.Есть ли способ добавить действие ко всем созданным узлам, кроме одного узла в swift?

Или я хотел бы найти способ доступа ко всем узлам другим способом использования метода «имя».

Это не полная игра, но я не хочу использовать метод «имя», потому что каждый квадрат имеет другое имя.

import SpriteKit 
import GameplayKit 
var Score = 0 

class GameScene: SKScene { 

let SquareSide = 100 
var touchedNode = SKNode() 
var touchLocation = CGPoint() 
let ScoreLabel = SKLabelNode() 
let squareNumber = 0 

override func didMove(to view: SKView) { 
CreatSquares() 
} 

func CreatSquares(){ 

let square = SKShapeNode(rect: CGRect(x:  Int(arc4random_uniform(UInt32(self.frame.width))), y: Int(arc4random_uniform(UInt32(self.frame.height))), width: SquareSide, height: SquareSide)) 

if Score <= 10{ 
square.fillColor = UIColor.orange} 
else{ 
square.fillColor = UIColor.blue 
     } 
square.physicsBody =  SKPhysicsBody(rectangleOf: CGSize(width: square.frame.width, height: square.frame.height), center: CGPoint(x: square.position.x, y: square.position.y)) 

square.physicsBody?.affectedByGravity = false 

square.physicsBody?.allowsRotation = false 
square.physicsBody?.categoryBitMask = 0 
square.name = "square\(number)" 

number++ 
self.addChild(square) 

    } 


} 
func CreatScoreLabel(){ 
let ScoreLabel = SKLabelNode() 

ScoreLabel.text = "Your Score is:\(Score)" 

ScoreLabel.position = CGPoint(x: self.frame.width/2, y: self.frame.height - 50) 

ScoreLabel.color = UIColor.white 
    self.addChild(ScoreLabel) 

} 

func updatScore(){ 
ScoreLabel.text = "Your Score is:\(Score)" 

} 

override func touchesBegan(_ touches:  Set<UITouch>, with event: UIEvent?) { 
for touch in touches { 
touchLocation = touch.location(in: self) 
touchedNode = self.atPoint(touchLocation) 
if touchedNode.name == "square"{ 
Score += 1 
touchedNode.removeFromParent() 
      } 


    } 

    } 
override func update(_ currentTime: TimeInterval) { 
updatScore() 
} 
+0

Я считаю, что ваш вопрос непонятен, не могли бы вы объяснить, но более того, я могу помочь? –

+0

Я хочу добавить действие для всех созданных узлов на сцене, кроме одного узла (например, LabelNode) – Nour

+0

Но прямо сейчас в моем коде есть только один узел, к которому я не хочу добавлять действие для него, но когда Я хочу, чтобы в моей игре было больше одного узла. Не хотите добавлять к ним действие. – Nour

ответ

1

Как объясняется Confused я думаю, что вы забыли реальную власть enumerateChildNodes(withName:

Действительно, о названии:

Название для поиска. Это может быть либо буквальное имя узла , либо настраиваемая строка поиска. См. Searching the Node Tree.

Это означает, что вы можете сделать:

self.enumerateChildNodes(withName: "//square*") { node, _ in 
    // node is equal to each child where the name start with "square" 
    // in other words, here you can see square0, square1, square2, square3 etc... 
    if node.name == "square3" { 
     // do whatever you want with square3 
    } 
} 

// указывает, что поиск должен начинаться с корневого узла и выполняется рекурсивно по всему дереву узлов. В противном случае он выполняет рекурсивный поиск из своей текущей позиции.

* означает, что поиск соответствует нулю или более символов.

1

Самый простой способ сделать это, чтобы добавить все узлы, которые необходимо добавить действия, чтобы в массив, а затем перебрать этот массив, добавив действия, когда вы хотите/должны.

У этого есть память, если ваши объекты огромны и сложны, но это самый организованный и быстрый способ сделать это, не используя .name.

И гораздо быстрее и проще, чем возиться с помощью иерархии узлов с enumerateChildNodes... и т.д.

Смежные вопросы