2016-03-15 2 views
0

У меня проблема с SpriteKit и Swift.Swift SKSpriteNode исчезнет, ​​но по-прежнему доступен.

Я добавляю SKSpriteNode s в разных точках кода к сцене - некоторые из них доступны для кликов, некоторые - нет. Я использую интерактивные узлы как меню для плеера. Так, например, если он нажимает InventoryButtonNode, он переходит в инвентарь. В инвентаре он может касаться PlayButton и прыгать обратно в игру. Таким образом, первый я добавить узлы:

override func didMoveToView(view: SKView) { 
    PlayButton = SKSpriteNode(imageNamed: "PlayButton") 
    PlayButton.size = CGSize(width: 100, height: 100) 
    PlayButton.position = CGPoint ... // not important 
    PlayButton.zPosition = 200 
    PlayButton.name = "PlayButton" 
    self.addChild(PlayButton) 
    InventoryButton = SKSpriteNode(imageNamed: "InventoryButton") 
    InventoryButton.size = CGSize(width: 100, height: 100) 
    InventoryButton.position = CGPoint ... // different position than PlayButton 
    InventoryButton.zPosition = 200 
    InventoryButton.name = "PlayButton" 
    self.addChild(InventoryButton) 

В переопределении FUNC touchesBegan Я использую это «меню» -nodes, здесь, например, InventoryButton-Node.

if InventoryButton.containsPoint(touch.locationInNode(self)) { 
    print("Show Inventory") 
    ShowInventory() 
} 

Теперь в функции ShowInventory() я хочу, чтобы удалить эти «меню» -Buttons из поля зрения, так что я могу добавить другие узлы, чтобы показать инвентаризации проигрывателя.

func ShowInventory(){ 
    PlayButton.removeFromParent() 
    InventoryButton.removeFromParent() 
} 

Если я создам и запускаю это, узлы будут удалены - или лучше сказать - они станут невидимыми.

Потому что, если я касаюсь сейчас в позиции InventoryButton, я до сих пор получаю отпечаток «Показать инвентарь» - поэтому функция по-прежнему реагирует на мое прикосновение, даже если узел не виден.

Моя проблема в том, что у меня есть, как 4-х различных функций, таких как ShowInventory() .. У меня есть ShowGame() и так далее .. и я хочу в этих функций, чтобы полностью удалить узлы и «Touch» -Возможность ..

мне нужна функция, которая может удалить узлы полностью ..

Я даже пробовал:

func ShowInventory(){ 
    self.removeAllChildren() 
} 

я серый фон без каких-либо узлов .. но все равно - если я прикасаюсь, где положение инвентаризации Кнопки я получил f unction и печать «Показать инвентарь» ... это расстраивает.

ответ

3

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

Даже если узел удален из его родителя, он по-прежнему имеет position и size. Эти два свойства используются containsPoint:, чтобы определить, находится ли точка в узле

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

if InventoryButton.parrent != nil && InventoryButton.containsPoint(touch.locationInNode(self)) { 
    print("Show Inventory") 
    ShowInventory() 
} 
+0

Большое спасибо! Наконец, это работает. Вау - спасибо. .. О, и ваше объяснение велико. – aignetti

+1

Интересно - я думал, что removeFromParent полностью удалил узел, а не просто удалив его из представления. Я использую removeFromParent для кирпичей в моей игре Breakout, и игра затем играет так, как будто кирпич никогда не существовал. (Без столкновений и т. Д.) –

+0

Если вы используете физический движок, удаление узла остановит проверку физики на нем. 'containsPoint' просто спрашивает, находится ли точка в узле с ограничивающим прямоугольником. –

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