2014-12-09 7 views
0

В быстром, код ниже вызывается с определенной скоростью (2 раза в секунду) от didMoveToView(). Каждый раз, когда вызывается эта функция, на экране должен появляться новый круговой поток. Но вместо того, чтобы постоянно добавлять их, когда он пытается добавить второй, он выдает ошибку: попытался добавить sknode, у которого уже есть родитель. Я понял, что вы не можете сделать дубликат узла на одном и том же представлении. С учетом этого я пришел к выводу, что мне нужно будет создать массив SKShapeNodes, поэтому всякий раз, когда вызывается функция, он берет один из массива и добавляет его в представление. Когда узел достиг дна (y = -20) в моем случае, тогда ему нужно будет удалить узел и снова использовать его для использования.Создать массив SKShapeNodes. Swift> Xcode 6

Итак, мой вопрос: Как сделать массив из SKShapeNode s, поэтому, когда моя функция ниже называется, он займет новый узел и отобразит его в представлении? Кроме того, когда узлы покидают представление, ему нужно будет снова использовать узел для использования.

let circlenode = SKShapeNode(circleOfRadius: 25) //GLOBAL 

func thecircle() { 
    circlenode.strokeColor = UIColor.whiteColor() 
    circlenode.fillColor = UIColor.redColor() 

    let initialx = CGFloat(20) 
    let initialy = CGFloat(1015) 

    let initialposition = CGPoint(x: initialx, y: initialy) 
    circlenode.position = initialposition 


    self.addChild(circlenode) 

    let action1 = SKAction.moveTo(CGPoint(x: initialx, y: -20), duration: NSTimeInterval(5)) 
    let action2 = SKAction.removeFromParent() 
    circlenode.runAction(SKAction.sequence([action1, action2])) 
} 

ответ

2

Так что вы правы в том, что проблема кода выше является то, что SKNode может иметь только один из родителей.

У вас есть 2 подхода, которые вы могли бы предпринять.

  1. Создать массив вашего SKShapeNode s
  2. Создать новую SKShapeNode при необходимости

Первого имеет ограничение, что вам нужно следить за вашу общую сумму кругов, иначе вы будете превышают ваши границы. Если вы удаляете элементы, это также означает учет его. У последнего есть накладные расходы на генерацию SKShapeNode, когда вам это нужно. Скорее всего, это не будет проблемой.

Чтобы создать массив, который вы хотите сделать что-то вроде (вариант 1):

var circleArray:[SKShapeNode] = [SKShapeNode]() // Property in your class 

// Code in your init or wherever else you want, depending on what class this is. 
// 10 is just an arbitrary number 
for var i=0;i<10;i++ { 
    circleArray.append(SKShapeNode(circleOfRadius: 25)) 
} 

Если вы хотите, чтобы добавить его в вашем thecircle, где вы звоните self.addChild(circlenode) что-то вроде:

if numCircles < circleArray.count { 
    SKShapeNode *circlenode = circleArray[numCircles] 

    // Do other initialization here 

    self.addChild(circlenode) 
    numCircles++ 
} 

Или вы можете сделать (вариант 2):

SKShapeNode *circlenode = SKShapeNode(circleOfRadius: 25) 

// Do other initialization here 

self.addChild(circle node) 

Я бы, наверное, сделать вариант 2 чтобы не иметь дело с каким-либо управлением количеством выдающихся кругов в массиве. Это особенно важно, если вы удаляете круги и хотите их переработать.

+0

Благодарим вас за подробный ответ! Я проведу этот код быстрым на этой неделе и дам вам знать, как он прошел! – 24GHz

+0

Фантастический! Вариант 1 действительно работал лучше для меня :) Большое спасибо за помощь – 24GHz

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