2016-12-01 44 views
4

在SpriteKit的SKSpriteNodes和其他可见的节点,响应触摸这些节点往往以某种方式做这样的:touchesBegan,如何获得所有触及,不只是第一次或最后一次?

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?

= touches.first限制条件只响应此SKSpriteNode内的第一个触摸。它是如何处理这个SKSpriteNode中的所有触摸的,这样每个触摸点都有其可用的位置,或者其它任何其他位置都可用,并且可以随身携带。

我知道。愚蠢的问题。我是那个人。我根本看不出这是如何完成的。

+0

我们谈到的阅读文档和理解每一行代码的做法很多很好的答案 - 这是派上用场了。 'touches.first'返回第一次触摸,所以你应该问'触摸是什么?'。那么当您查看方法签名时,您会看到'接触'是'Set '。当你点击'触摸'时,你也会在Xcode中看到这个工具提示。现在你的问题是'如何访问Set的每一个成员',所以你可以前往Swift文档和集合参考中的'Set'信息。练习问这些问题:-) –

+0

缺失:“做到这一点的最佳方式?”,“最高效的?”,“最灵活的方式是什么?”和其他我不敢问的主观问题,但要回答。我知道这是一个'Set',来自'Set ',我知道如何通过'for循环访问Set的内容......'但当然,这不可能是最好的/正确的/灵活的方式来做一些与处理触摸一样重要的事情......对吗? ! @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

这真的是它的程度吗? @流利没有更好,更严格?没有更多...抛光和有目的的了吗? – Confused

+0

不是没有更多的信息。有无数的例子。 @如果你了解集合如何工作,那么你就会知道如何使用一组触摸。你想用这些方法做什么?没有办法让他们没有迭代,因为他们是一个集合。 – 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也许现在我可以买得起像你这样的赏金。 TY – Fluidity

相关问题