如何获得 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 的准确触摸位置?的主要内容,如果未能解决你的问题,请参考以下文章

检测 SKShapeNode 上的触摸是一条线

SpriteKit 中坐标空间之间的转换问题

SKShapeNode 检测两条线的交点

如何在android中获得触摸位置?

当所需的触摸次数超过一次时,如何获得 UILongPressGestureRecognizer 的触摸位置?

如何通过点击在 Android 中获得准确的 GPS 位置