spritekit使childnode不可触摸

时间:2017-07-28 18:48:19

标签: sprite-kit

我有一个菜单按钮(skSpriteNode)和这个精灵内的小游戏图标

mainButton.addChild (playIcon)
mainButton.name = "xyz"
addchild (mainButton)
好吧,我给了按钮名称,以检查是否触摸了具有此名称的精灵。

当我触摸按钮内的图标子项时,touchNode.name为nil。我为图标子设置了isUserInteractionEnabled = false。我想将触摸传递给父母。我怎么能这样做。

  for touch in touches {

            let location = touch.location(in: self)
            let touchedNode  = self.atPoint(location)

            if (touchedNode.name != nil) {
                print ("node \(touchedNode.name!)")
            } else {
                continue
            }
 }

2 个答案:

答案 0 :(得分:4)

您必须在touchesBegan的子类中实现SKSpriteNode并设置其isUserInteractionEnabled = true,以便接受并处理该特定节点(按钮)的触摸。

import SpriteKit

protocol ButtonDelegate:class {

    func printButtonsName(name:String?)
}

class Button : SKSpriteNode{

    weak var delegate:ButtonDelegate?

    init(name:String){
        super.init(texture: nil, color: .purple, size: CGSize(width: 250, height: 250))
        self.name = name
        self.isUserInteractionEnabled = true
        let icon = SKSpriteNode(color: .white, size: CGSize(width:100, height:100))
        addChild(icon)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


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



        delegate?.printButtonsName(name: self.name)
    }  
}

class GameScene: SKScene, ButtonDelegate {

    override func didMove(to view: SKView) {

        let button = Button(name:"xyz")
        button.delegate = self


        button.position = CGPoint(x: frame.midX - 50.0, y: frame.midY)


        addChild(button)

    }

    func printButtonsName(name: String?) {

        if let buttonName = name {
            print("Pressed button : \(buttonName) ")
        }
    }
}

现在,此按钮将吞下触摸,图标精灵将被忽略。

我刚刚修改了one我的答案中的代码,以根据您的需求制作一个示例,但如果感兴趣的话,您可以在该链接中阅读更详细的内容。

答案 1 :(得分:1)

我实现了Touchbegan按钮并试图为滑块实现一个子类,背景和滑块内的子拇指。我在我的GameScene中添加了sliderDelegate Protocoll。向下的触摸是可以的,但我没有动手

import Foundation
import SpriteKit


protocol SliderDelegate:class {

    func touchesBeganSKSpriteNodeSlider(name:String?, location: CGPoint?)
    func touchesMovedSKSpriteNodeSlider(name:String?, location: CGPoint?)
    func touchesEndedSKSpriteNodeSlider(name:String?, location: CGPoint?)

}


class SKSpriteNodeSlider : SKSpriteNode{

    weak var delegate:SliderDelegate?

    init(imageNamed: String){

        // super.init(imageNamed: imageNamed)
        let texture = SKTexture(imageNamed: imageNamed)
        super.init(texture: texture, color: .white, size: texture.size())
        // self.name = name
        self.isUserInteractionEnabled = true
        // let icon = SKSpriteNode(color: .white, size: CGSize(width:100, height:100))
        // addChild(icon)
    }

    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }


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

        // for touch in touches {
        if let touch = touches.first {
            let loc = touch.location(in: self)
            delegate?.touchesBeganSKSpriteNodeSlider(name: self.name, location: loc)

        }

    }


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

        print ("touchesMoved")

        // for touch in touches {
        if let touch = touches.first {
            let loc = touch.location(in: self)
            delegate?.touchesMovedSKSpriteNodeSlider(name: self.name, location: loc)
         }

    }


    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {
            let loc = touch.location(in: self)
            delegate?.touchesEndedSKSpriteNodeSlider(name: self.name, location: loc)
        }

    }

}