如何获得 SKShapeNode 的准确触摸位置?
Posted
技术标签:
【中文标题】如何获得 SKShapeNode 的准确触摸位置?【英文标题】:How can get the exact touch position of a SKShapeNode? 【发布时间】:2017-03-17 11:37:46 【问题描述】:如果形状是矩形,则触摸位置完全正确。但是如果一个形状包含透明区域(如下面的三角形),当用户点击透明区域(屏幕上的空白区域)时,触摸也是有效的。
当屏幕上有很多形状时,用户可能点击正确的位置却得到错误的形状。例如,如果用户想要选择绿色三角形并点击红点,但选择的形状将是粉色三角形,因为粉色三角形的 zPosition 高于绿色三角形,并且触摸位置在粉色三角形的透明区域内。
这里是开始时创建形状的代码:
var touchShapeName:String!
var currShape: SKShapeNode!
var shapeArr = [SKShapeNode]()
创建形状:
for i in 1...count
let shape = SKShapeNode()
shape.path = petalPath
shape.strokeColor = UIColor(red: 0.9, green: 0.7, blue: 0.1, alpha: 1.0)
shape.lineWidth = 0.1
shape.glowWidth = 0.1
shape.fillColor = UIColor(red: getRandomColor(245, 255), green: getRandomColor(190, 210), blue: getRandomColor(10, 15), alpha: 0.98)
shape.name = "\(i)"
shape.position = CGPoint(x: frame.midX + CGFloat( 30 * i ), y:frame.midY + 60)
addChild(shape)
shapArr.append(shape)
我使用以下代码来获取形状:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
let touch = touches.first
let location = touch?.location(in: self)
touchShapeName = self.atPoint(location!).name
if currShape == nil
for s in shapeArr
if s.name == touchShapeName
currShape = s
现在,点击颜色区域可以创建和移动形状。问题是点击上面透明区域的形状可能会得到错误的形状,正如我上面解释的那样。
我是否编写了正确的代码?是否有任何其他解决方案可以获得确切的位置?
谢谢。
【问题讨论】:
是的,这是获取准确位置的正确代码。虽然您可能没有点击实际图像,但我指的是绿色图像,但根据屏幕,点击的部分会为您提供准确的点。 同意@poles。另外,如果你需要的是触摸相对于绿色形状的坐标,参见SKNode中的convert(_:to:)方法。 @AliBeadle 可以告诉如何使用 convert(_:to:) 方法获取它?我试过 currShape = SKShapeNode() convert(location!, to: currShape) print(currShape.name),但它打印为零。 @jdleung 您在该点当前所在的 SKNode 实例上调用 convert(在您的情况下,这将是场景 - 这是一个 SKNode)并将您希望坐标为的实例传递给它in. 结果是另一个坐标。所以: let newPoint = convert(location!, to: currShape) print(newPoint) (但我真的不喜欢这样强制展开位置 - 研究更安全的可选展开技术)。 @AliBeadle 抱歉,我仍然无法获得 zPosition 较低的形状。 ;-( 【参考方案1】:我相信您在这里误用了形状节点:您正在尝试对三角形进行操作,同时为其选择矩形形状。如果您想要一个三角形,那么您需要使用适当的路径,而不是通用矩形。一旦你用三角形表示一个三角形,触摸位置检测应该会自动修复。
【讨论】:
三角形是一个例子来解释这个问题,实际上形状有很多种。我已经画出了形状,我面临的是如何在其上部形状的透明区域下选择形状。以上是关于如何获得 SKShapeNode 的准确触摸位置?的主要内容,如果未能解决你的问题,请参考以下文章