2015-08-28 3 views
0

Я начинаю и собираю игру SpriteKit в Swift, iOS Xcode. GameViewController передает значение имя: String - GameScene. GameScene обновляет два изображения/SKSpriteNodes с именем apple.png и orange.png. Два изображения/SKSpriteNodes занимают примерно одинаковое положение, поэтому они не должны перекрываться. Но после нескольких обновлений все они перекрываются. У меня есть смутная идея, что я создаю слишком много экземпляров, а не , обновляю, но, к сожалению, это конец моих знаний.iOS SpriteKit накладывается SKSpriteNodes/images

Как остановить перекрытие изображений при каждом обновлении? Спасибо за помощь.

func updateName(name: String) { // name:String is passed from gameViewController 
var XYZ = SKSpriteNode(imageNamed: "\(name).png") 
if (name == "apple") { 
    XYZ.anchorPoint = CGPointMake(...) 
    XYZ.position = CGPoint(...) 
    XYZ.setScale(...) 
    self.addChild(XYZ) 
    // animation of apple 
} else if (name == "orange") { 
    XYZ.anchorPoint = CGPointMake(another set of ...) 
    XYZ.position = CGPoint(another set of ...) 
    XYZ.setScale(snother set of ...) 
    self.addChild(XYZ) 
    // animation of orange 
} 
} 
+0

Можете ли вы быть более конкретными относительно того, что вы ищете – MaxKargin

+0

С каким методом этот код? Когда метод вызывается? –

+0

@robmayoff Метод от Swift - см. Отредактированный вопрос. func updateName (name: String) вызывается при обновлении «apple» и «orange». Спасибо. – abacaba

ответ

2

Вместо добавления ребенку каждый раз, когда на вершине друг друга, взять существующий spriteNode и просто обновить текстуру (если вы объявляете ваш спрайт убедитесь, чтобы установить name свойство, чтобы вы могли получить доступ к ним). Ваша функция будет выглядеть следующим образом:

func updateName(name: String) { // name:String is passed from gameViewController 
var XYZ: SKSpriteNode = self.childNodeWithName("\(name)") as SKSpriteNode 
if (name == "apple") { 
    XYZ.texture = //set texture however you'd like 
    // animation of apple 
} else if (name == "orange") { 
    XYZ.texture = //set texture however you'd like 
    // animation of orange 
} 
} 

Таким образом, вы не создаете все больше и больше XYZ спрайтов каждый раз, а получать тот же spriteNode в соответствии с его именем, чтобы обработать анимацию. Кроме того, если у вас есть несколько из этих спрайтов одновременно с тем же именем, вместо этого вы должны передать сам спрайт в функцию, чтобы убедиться, что у вас есть правильный экземпляр.

Надеюсь, это поможет! Дайте мне знать, если у вас есть вопросы.

+0

спасибо, пожалуйста, см. Следующий вопрос ниже ... – abacaba

0

В начале GameScene я объявил XYZ как этот

XYZ = SKSpriteNode() 

Внутри функции, линия

var XYZ: SKSpriteNode = self.childNodeWithName("\(name)") as SKSpriteNode 

возвращает ноль, хотя

println("\(name)") 

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

name.name = "\(name)" 
+0

его свойство имени XYZ, поэтому его будет задано как 'XYZ.name =" \ (name) "' – MaxKargin

+0

и вы добавляете XYZ в качестве ребенка из себя? – MaxKargin

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