Sprite kit 触摸spritenode的透明区域

Sprite kit 触摸spritenode的透明区域,sprite-kit,Sprite Kit,我有几颗看起来不定形的纽扣。(按钮的矩形相交)首先我在游戏场景中评估了BeganTouch。然后我接触了几次 因为我的按钮中仍然有子节点,所以它们吞噬了触摸屏。好的,我已经在这里的帮助下创建了SpriteNodes的一个子类,并在子类中处理了触摸。现在我有一个问题,第一个按钮不能将触摸传递给底层精灵 但是现在我想忽略按钮的透明区域,我该怎么做呢 我已经读过,一个人可以使用physicsbody,我已经尝试过,重力=0,但由于我通过动作移动和缩放按钮,因此产生了暴力效果 为什么我可以在触摸位置检查

我有几颗看起来不定形的纽扣。(按钮的矩形相交)首先我在游戏场景中评估了BeganTouch。然后我接触了几次

因为我的按钮中仍然有子节点,所以它们吞噬了触摸屏。好的,我已经在这里的帮助下创建了SpriteNodes的一个子类,并在子类中处理了触摸。现在我有一个问题,第一个按钮不能将触摸传递给底层精灵

但是现在我想忽略按钮的透明区域,我该怎么做呢

我已经读过,一个人可以使用physicsbody,我已经尝试过,重力=0,但由于我通过动作移动和缩放按钮,因此产生了暴力效果

为什么我可以在触摸位置检查alpha并将触摸传递给下一个精灵

顺便问一下:我如何获得视图的引用?以获得全球loc。 let loc=触摸位置(在:视图中)


使用全局触摸定位,我可以检查该点下所有精灵的alpha

您可以尝试从子类将触摸传递给它的父类(可能是场景)

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    if let touch = touches.first as UITouch! {

        //handle whatever code you want your subclass to do
        ... 

        //pass the touch event to the parent
        super.touchesBegan(touches, with: event)
    }
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
如果让触摸=触摸。首先作为UITouch{
//处理您希望子类执行的任何代码
... 
//将触摸事件传递给家长
super.touchesbeated(touches,with:event)
}
}
然后在你的场景中,循环浏览你的按钮(在这个例子中,我有一个按钮数组中的按钮)

override func touchsbegind(touch:Set,带有事件:UIEvent?){
如果让触摸=触摸。首先作为UITouch{
让touchLocation=touch.location(in:self)
用于按钮中的按钮{
如果按钮包含(触摸位置){
//处理所有其他按钮
...
}
}
}
}

虽然在两个不同的位置进行触摸似乎有点多余@Knight0fDragon是正确的,有一个按钮有透明区域似乎很奇怪。

好的,很简单,所有按钮都来自同一个子类。这个子类委托给游戏场景中的一个方法。在这里我可以和你核对一下

allNodes=节点(at:GlobalAllocation)

现在我可以检查节点的名称,计算每个节点内像素的点,并得到alpha值


thanxs all

不,我是在一个类似于另一个答案的次循环中做的。那很好。但是,当用户在透明区域中触摸第一个按钮时,按钮1后面的按钮2没有得到触摸事件。因此,我需要全局定位来触摸所有其他按钮,并检查不透明像素。您需要评估纹理,以确保没有碰到这些透明点。但真正的问题是,为什么?你有这么多的透明区域,你可以用手指触摸来辨别吗?正常情况下,用户会触摸按钮的光学中心,但德国创意机构和那里的一流汽车客户会寻找不可触摸的区域来给程序员带来压力。我可以看到,这是允许像素完美精度的设备上的一个因素,但是对于一个依靠手指按压的触摸屏来说,它实际上提供了一个更好的用户体验,将按钮延伸到框外,因为你不能用手指以像素级的精度按压。但不管怎样,就像我说的,你知道按钮上触摸的位置,所以只需检查该位置的纹理以确定它是否透明。我想你是想调用
parent?.touchesbreated
而不是
super.touchesbreated
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    if let touch = touches.first as UITouch! {

        let touchLocation = touch.location(in: self)

        for button in buttons {

            if button.contains(touchLocation) {
                //handle all other buttons
                ...
            }
        }
    }
}