Ios 如果像素是透明的,我如何制作一个对触摸没有反应的SKSpriteNode?

Ios 如果像素是透明的,我如何制作一个对触摸没有反应的SKSpriteNode?,ios,iphone,swift,ipad,sprite-kit,Ios,Iphone,Swift,Ipad,Sprite Kit,我正在使用swift编写的精灵工具包为iOS创建一个游戏。我在屏幕上有一堆可以拖动的SKSpriteNode。它们是各种各样的形状,比如一个人、一个苹果、一本书等等。问题是,假设这个人在苹果前面,但是你可以通过人物图像png中的透明像素看到这个人后面的苹果。当你去触摸苹果移动它时,这个人被选中是因为那些透明的像素而不是苹果 如果像素是透明的,如何制作对触摸不响应的SKSpriteNode?如果要选择被另一个精灵部分隐藏的精灵,可以使用获取用户触摸下的节点阵列。然后,您可以在阵列中的节点上进行迭代

我正在使用swift编写的精灵工具包为iOS创建一个游戏。我在屏幕上有一堆可以拖动的SKSpriteNode。它们是各种各样的形状,比如一个人、一个苹果、一本书等等。问题是,假设这个人在苹果前面,但是你可以通过人物图像png中的透明像素看到这个人后面的苹果。当你去触摸苹果移动它时,这个人被选中是因为那些透明的像素而不是苹果


如果像素是透明的,如何制作对触摸不响应的SKSpriteNode?

如果要选择被另一个精灵部分隐藏的精灵,可以使用获取用户触摸下的节点阵列。然后,您可以在阵列中的节点上进行迭代,以查找并选择最靠近接触点的节点。以下是如何在Swift中执行此操作的快速示例:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch = touches.first as? UITouch {
        let location = touch.locationInNode(self)

        var closest:CGFloat?
        let nodes = nodesAtPoint(location)
        for node in nodes as! [SKNode] {
            if let sprite = node as? SKSpriteNode {
                // Calculate the distance from the node to the touch
                let dx = location.x - node.position.x
                let dy = location.y - node.position.y
                let distance = dx*dx + dy*dy
                // Find the closest
                if closest == nil || distance < closest! {
                    closest = distance
                    selected = sprite
                }
            }
        }
    }
}

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let sprite = selected {
        if let touch = touches.first as? UITouch {
            let location = touch.locationInNode(self)
            sprite.position = location
        }
    }
}

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    selected = nil
}
以下是通过触摸上述代码移动的形状片段:


你说的透明像素是什么意思?你能展示一个截图吗?我不能展示一个项目的图片,因为业主不允许,但我会尝试更清楚地描述它。这张照片是一个人的手臂伸向一侧,与身体形成一个t形。SpriteKit将其视为一个矩形,高度从头顶到脚底,宽度从指尖到指尖。尽管他手臂上下的图像大部分都是空白。他手臂下方的空白区域不允许用户触摸可见的物体。也许这会有所帮助:你的要求需要一个像素完美的算法。一种方法是沿着角色的轮廓定义一个CGPath,并检测触摸点是否位于CGPath内。今晚我将尝试这个方法。谢谢你的评论,谢谢你的回复。问题是,假设这个精灵是一个手臂伸向一边的人。Sprite kit将其视为一个矩形,包括手臂周围的所有空像素。如何才能忽略手臂周围的透明像素并选择手臂后面的项目。精灵周围的矩形称为边框或边框。当用户触摸屏幕时,Sprite工具包会找到包含该点的所有边界框。NodeStatPoint复数返回与这些边界框对应的节点数组。然后,您可以通过该阵列进行搜索,以查找/选择距离接触点最近的节点。我的答案说明了如何做到这一点。今晚我会试试这个。谢谢你抽出时间。