2016-04-10 6 views
1

У меня, похоже, проблемы с одним из узлов на моей сцене.Swift + SpriteKit - кнопка доступна только тогда, когда ее не видно

У меня есть кнопка:

func createAttackButton() { 
    attackButton.zPosition = 1 
    attackButton.anchorPoint = CGPointZero 
    attackButton.position = CGPointMake(20, 20) 
    attackButton.size = CGSize(width: 150, height: 40) 

    addChild(attackButton) 

} 

Эта функция вызывается при контакте с противником.

Чтобы запустить функцию из этой кнопки я использую touchesBegan() FUNC:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    for touch: AnyObject in touches { 
     let location = touch.locationInNode(self) 

     if attackButton.containsPoint(location) { 

      print("Attack Button Clicked") 

     } 
    } 
} 

После того, как враг был уничтожен, я удалить кнопку атаки Узел:

attackButton.removeFromParent() 

Однако в область, где появляется кнопка атаки, после ее удаления эта область по-прежнему доступна.

Любые идеи?

ответ

2

Кажется, что независимо от того, добавлен ли узел в родительский элемент, метод containsPoint будет вести себя одинаково. Значит, он всегда будет возвращать true, если данная точка находится внутри системы координат родителя (в вашем случае, кнопки).

Вы можете проверить это, инициализируя attackButton, не добавляя его в сцену. Если вы коснетесь в левом нижнем углу сцены, сообщение от touchesBegan будет напечатано.

Я думаю, это происходит из-за того, что каждый узел имеет свой position свойство, установленное на CGPoint(0,0) по умолчанию. Кроме того, в вашем случае кнопка имеет свой размер. И он будет иметь свой размер и положение, даже если он не добавляется к его родительскому объекту (или удаляется из его родителя), потому что он определенно определен как свойство, и есть сильная ссылка на него.

+1

Да, containsPoint - это простой пример сравнения, нет родителя, чтобы заставить его работать. «Ограничения узла содержат указанную точку?» - это в основном то, что выполняет функция. Поскольку позиция не является необязательной, вы всегда сможете иметь containsPoint быть проходимым, если только он не допускает ширину и высоту нуля, не уверен, что это разрешено. – Knight0fDragon