2015-10-16 8 views
6

Я начинаю изучать Swift2 для разработки на iOS с помощью SpriteKit, и я не могу обнаружить, что коснулся видимой части моего спрайта.Обнаружение касания в ограничительной рамке (альфа-маска) спрайта с помощью SpriteKit

я могу найти, какой узел был затронут так:

let touchedNode = self.nodeAtPoint(location) 

Но это обнаружить прикосновение спрайта. Я хотел бы обнаружить прикосновение к «непрозрачной» части спрайта.

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

sprite.physicsBody = SKPhysicsBody.init(texture: sprite.texture!, size: sprite.size) 
sprite.physicsBody?.affectedByGravity = false 
if (touchedNode.containsPoint(location)){ 

Но это не помогло. Если я щелкнув прозрачную часть моего спрайта, событие все еще запускается.

Документация гласит: «Создан новый физический корпус, который включает в себя все тексели в текстуре, которые имеют ненулевое значение альфа». Так не должно ли это работать?

Спасибо за ваше время.

PS: Я также старался быть более щедрым на своем альфа-пороге, но это также не сработало (в случае, если моя прозрачность не была идеальной).


UPDATE:

Чтобы добавить немного больше деталей, я строю редактор уровней. Это означает, что я создам много узлов, в зависимости от того, что выбирает пользователь, и мне нужно иметь возможность выбирать/перемещать/вращать/и т. Д. Эти узлы. Я фактически использую SKSpriteNodes, так как мои PNG-изображения автоматически добавляются в xcassette таким образом. Я решил использовать ограничительную рамку Alpha Mask для PhysicalBody, поскольку это значение показано в редакторе сцен (Xcode), когда вы выбираете узел, а когда выбрано, Alpha Mask выделяет именно ту часть моего спрайта, что я хочу иметь возможность обнаружите прикосновение внутри.

Если я использую неправильные идеи/методы, скажите, пожалуйста. Это возможно, поскольку я только начинаю использовать Swift и SpriteKit.


UPDATE 2

переспросила я в physicsWord (как рекомендуется), чтобы получить право physicsBody и получил имя вложенного узла, как это:

let body = self.physicsWorld.bodyAtPoint(location) 
print(body?.node?.name) 

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

Благодарю вас за помощь.

+0

Вы нашли хороший способ сделать это? – Confused

ответ

2

SKPhysicsBody не определяет границы SKNode. Вы можете выполнить проверку попадания, запросив SKPhysicsWorld вашей сцены, вызвав на нем bodyAtPoint. Это вернет SKPhysicsBody, который вас интересует.

+0

Мне кажется, это было бы избежать слона в комнате. Я делаю это неправильно? Какая хорошая практика для обнаружения прикосновения к объектам сцены, от их ограничивающей рамки (альфа-маска)?Я имею в виду, что это решение, безусловно, является взломом вокруг более фундаментальной проблемы, которая у меня есть, не так ли? Спасибо вам за ваше терпение. –

+0

Мой отредактированный ответ лучше и, кажется, «правильный» способ обнаружить штрихи на SKSpriteNodes –

+0

Hum, я пробовал делать «self.physicsWorld.bodyAtPoint (location)», и это возвращает мой спрайт точно так же, не заботясь о (даже если моя ограничивающая рамка правильная (я могу проверить ее, перемещая объект), он корректно сталкивается с другими объектами, используя ограничивающий рамку с альфа-маской, на который я пытаюсь обнаружить касание). –