2016-12-01 14 views
4

В SKSpriteNodes SpriteKit и других видимых узлов, отвечая на прикосновения в этих узлах часто делается каким-то образом, как это:touchsBegan, как получить все касания, а не только первым или последним?

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

     if let touch = touches.first {... 
// do something with the touch location that's now in touch 
// etc 

Это все замечательно, но что, если я хочу, чтобы убедиться, что я получаю сенсорную информацию из всех и всяких прикосновений внутри этого (давайте представим себе ...) SKSpriteNode?

= touchhes.first ограничивает условное реагирование только на первое касание внутри этого SKSpriteNode. Как это делается для всех прикосновений в этом SKSpriteNode, так что у каждого есть свое местоположение или что-то еще, что у него есть и что происходит.

Я знаю. Глупый вопрос. Я тот парень. Я просто не вижу, как это делается.

+0

Мы говорили о практике чтения документации и понимании каждой строки коды - это где пригождается. «touchhes.first» возвращает первое касание, поэтому вы должны спросить: «Что касается?». тогда, когда вы посмотрите на подпись метода, вы увидите, что «касания» - это «Установить ». Вы также увидите это в Xcode с подсказками, когда вы нажимаете «touch». Теперь ваш вопрос: «Как получить доступ к каждому члену набора», так что будьте внимательны к документации Swift и информации «Установить» в ссылке на коллекции. Практика, задающая такие вопросы :-) –

+0

Отсутствует: «лучший способ сделать это?», «Самый эффективный?», «Какой самый гибкий способ сделать это?» и другие субъективные вопросы, на которые я не смею спросить, но хочу ответить. Я знаю, что это 'Set', из' Set ', я знаю, как получить доступ к содержимому набора через цикл for ...'но, конечно же, это не может быть лучшим/правильным/гибким способом сделать что-то столь же важное, как обработка касаний ... правильно? ! @SteveIves. И тогда возникает необходимость в 'multipleTouchEnabled', который я бы узнал только через пробную версию и ошибку. И тогда есть другие, с тем же вопросом, с людьми, которые следуют. – Confused

+0

Но, прежде всего, мне досадно, что документация по всем вещам, которая должна/могла/была бы присуща использованию SpriteKit (если бы Apple позаботилась об этом и было много пользователей), в лучшем случае щадит ... – Confused

ответ

8

Обычно вид не реагирует на несколько касаний, если для свойства multipleTouchEnabled установлено значение true.

mySprite.multipleTouchEnabled = true 

Вы заметите, что метод touchesBegan:event: не возвращает один объекта UITouch, а набор (а.к.а. неупорядоченных коллекций) объектов UITouch.

Внутри этого метода вместо того, чтобы просто получить первое касание вне набора, вы могли бы (например) выполнить итерацию по множеству, чтобы проверить состояние на каждом касании.

for touch in touches { 
    // do something with the touch object 
    print(touch.location(mySKNodeObject)) 
} 
+0

это ответ – Fluidity

+0

Действительно ли это его масштаб? @Fluidity ничего лучше, более требовательный? Нет ничего более ... отполированного и целеустремленного? – Confused

+0

не без дополнительной информации. есть безграничные примеры. @Confused, если вы понимаете, как работает набор, вы бы знали, как использовать набор касаний. Что вы пытаетесь сделать со всеми этими касаниями? Невозможно получить их без итерации, потому что они представляют собой набор. – Fluidity

2

В ответ Сложение Commscheck, это то, как вы можете проверить, если узел находится в определенном месте:

for _touch in touches { 
    let aTouch = _touch.location(in: self) 
    if nodes(at: aTouch).contains(desiredNode) { 
    print("desired node found") 
    desireNode.doSomething() 

    // You can also do, 
    // if desiredNode.contains(aTouch) { 
    } 
} 

с использованием SKScene.nodes, а затем с помощью .contains поскольку nodes является массивом; SKScene наследует от SKEffectsNode который наследуется от SKNode .. команда нажмите SKScene в верхней части, или показать класс иерархии в навигаторе, и вы можете проследить это nodes всех пути вниз к истокам ...

open func nodes(at p: CGPoint) -> [SKNode]

Вы можете ввести «SKScene», а затем «.». просмотреть список всех его членов и правильные способы их реализации.

Кроме того, если вам просто нужно выполнять операции на одном конкретном узле, вы можете подкласс SKNode (создать собственный пользовательский узел), а затем переопределить его методы touches_.

Есть много хороших ответов здесь, показывающих, как сделать это :)

+0

Это стало очень полезным, чтобы решить мои проблемы с кнопками состояния касания от этого другого вопроса, вы все соленые и согнуты из-за формы;) – Confused

+0

heheh @Confused Я вижу, что вы, наконец, обошли мои ответы: P может быть, теперь я могу позволить себе такую ​​щедрость, как вы. ти – Fluidity