2016-09-14 4 views
1

Можно ли добавить SKSpriteNode в сцену из другого класса?Можно ли добавить SKSpriteNode в сцену из другого класса?

* Эти примеры

Так что у меня SKScene с пользовательским классом ..

class MainMenu: SKScene { 

    code... 

} 

И еще SKScene с пользовательским классом ..

class GameOver: SKScene { 

    code... 

} 

У меня есть еще один класс под названием PopupMenu ...

class PopupMenu: SKScene { 

    func addSprite() { 

    theSprite = SKSpriteNode.init(imageNamed: "theImage") 
    theSprite.position = CGPointMake(self.frame.width/2, self.frame.height/2) 
    theSprite.zPosition = 2 

    self.addChild(theSprite) 

} 

Так что я пытаюсь добиться того, чтобы щелкнуть кнопку меню шоу на сцене MainMenu и в GameOver Scene и иметь возможность вызывать функцию из PopupMenu, чтобы добавить этот узел в соответствующую сцену.

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

Есть ли лучший способ сделать это?

ответ

2

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

class MenuButton : SKSpriteNode 
{ 
    var length: CGFloat! 

    override init(texture: SKTexture!, color: SKColor!, size: CGSize) { 
     self.length = 50 // default lenght 
     super.init(texture: texture, color: color, size: size) 
    } 

    convenience init(color: SKColor, length: CGFloat = 50) { 
     var size = CGSize(width: length, height: length); 
     self.init(texture:nil, color: color, size: size) 
     self.length = length 
    } 

    required init?(coder aDecoder: NSCoder) { 
     // Decoding length here would be nice... 
     super.init(coder: aDecoder) 
    } 
} 
+0

что я имею в виду, что вы можете создать пользовательский класс (новый файл) е или ваш MenuButton наследует методы SKSpriteNode, поэтому в следующий раз, когда вы хотите, чтобы ваша пользовательская кнопка просто вы вызывали, пусть myBtn = MenuButton.init (...) –

+0

@AlessandroOrnano, я не уверен, что это отвечает на вопрос. Вы просто говорите о том, как проверить код, чтобы обеспечить освобождение, и показ кода о том, как сделать подкласс – Knight0fDragon

+0

@ Knight0fDragon Вы издеваетесь? Это естественный способ сделать настройку, есть несколько способов, это один из них. Я не здесь, чтобы делать работу над комиссиями, но давать советы и иллюстрировать методы, чтобы найти правильный путь. Ваш ответ - это еще один метод, который мне не нравится, потому что я думаю, что нелегко настроить его настолько глубоко, насколько это может сделать ню-код, но он может работать. –

4

Посмотрите на SKReferenceNodes, вы можете создать всплывающее меню, через SpriteKit Scene Builder, а затем сохранить это как файл sks. Когда придет время использовать его, вы просто подтягиваете файл всплывающего меню и добавляете его в сцену.

Источник: https://developer.apple.com/reference/spritekit/skreferencenode

Другой вещь, которую вы можете сделать, если вы планируете не использовать SKS Builder (который я рекомендую использовать, потому что это просто удивительная, и огромную экономию времени), чтобы подклассы вашего всплывающее меню, SKSpriteNode, не сцена

class PopupMenu: SKSpriteNode { 

    required init?(coder: aDecoder:NScoder) { 
     super.init(coder:aDecoder)  
    }  

    override init(texture: SKTexture!, color: SKColor!, size: CGSize) { 
     super.init(texture: texture, color: color, size: size) { 
    } 

    convenience init() { 
     self.init(imageNamed: "theImage") 
     self.zPosition = 2  
    } 


} 

Затем в коде сцены, просто позвоните

let popup = PopupMenu() 
popup.position = CGPointMake(self.frame.width/2, self.frame.height/2) 
self.addChild(popup) 
+0

Это интересно, и я никогда этого не делал, но если бы я это сделал, но как это получилось?Если это всего лишь файл sks, откуда будет работать код для меню? –

+1

... В том же месте, где находится любой другой код, вы устанавливаете поле Custom Class на сцене в построителе SKS – Knight0fDragon

+0

Я этого не знал, потому что я работал только с играми SpriteKit по коду. Я не использую конструктор SKS, так как он настолько глючен на Xcode 7. Он очистит мои узлы и иногда удалит все, несмотря на то, что я экономлю. –