如何获得SKShapeNode的确切触摸位置?

时间:2017-03-17 11:37:46

标签: ios swift touch skspritenode

如果形状为矩形,则触摸位置完全正确。但如果一个形状包含透明区域(如下面的三角形),当用户点击透明区域(它在屏幕上的空白区域)时,触摸也是有效的。

enter image description here

当屏幕上有许多形状时,用户可能会点击正确的位置但形状不正确。例如,如果用户想要选择绿色三角形并点击红点,但所选形状将是粉红色三角形,因为粉红色三角形的zPosition高于绿色三角形,触摸位置在粉红色三角形内部#39;透明区域。

enter image description here

以下是开始时创建形状的代码:

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
                }
            }
        }
    }

到目前为止,点击颜色区域时可以创建和移动形状。问题是,如上所述,点击具有上部透明区域的形状可能会形成错误的形状。

我是否写了正确的代码?是否有其他解决方案可以获得确切的位置?

THX。

1 个答案:

答案 0 :(得分:0)

我相信你在这里滥用了形状节点:你试图在三角形上操作,同时为它选择一个矩形形状。如果你想要一个三角形的形状,那么你需要使用一个合适的路径,而不是通用矩形。一旦用三角形表示三角形,触摸位置检测应自动修复。