0
votes

I make a small game with swift and spritekit and I am currently working on the menu and made a custom Buttonclass called SKButtonNode as a Button which is a subclass of SKNode. When I click on the Button on my phone nothing happens though, even when I use "userInteractionEnabled = true". So why can't I see a "test2" when I touch a button but only see it if I hit next to a button?

class SKButtonNode: SKNode {
    var defaultButton: SKSpriteNode
    var activeButton: SKSpriteNode
    var action: () -> Void

    init(defaultButtonImage: String, activeButtonImage: String, buttonAction:    () -> Void) {
        defaultButton = SKSpriteNode(imageNamed: defaultButtonImage)
        activeButton = SKSpriteNode(imageNamed: activeButtonImage)
        activeButton.hidden = true
        action = buttonAction

        super.init()

        userInteractionEnabled = true
        addChild(defaultButton)
        addChild(activeButton)
    }

class MenuScene: SKScene, SKPhysicsContactDelegate {

var startGameButton: SKButtonNode!
var optionsGameButton: SKButtonNode!
var exitGameButton: SKButtonNode!


// Update time
var lastUpdateTimeInterval: NSTimeInterval = 0


override func didMoveToView(view: SKView) {
    // Setup physics world's contact delegate
    physicsWorld.contactDelegate = self
    let startGameButton = SKButtonNode(defaultButtonImage: "blue_button_up", activeButtonImage: "blue_button_down" , buttonAction: startGame)

    startGameButton.position = CGPoint(x: 640, y: 330)
    startGameButton.activeButton.size = CGSize(width: 360, height: 95)
    startGameButton.defaultButton.size = CGSize(width: 360, height: 95)
    startGameButton.name = "startGameButton"


    let startOptionsButton = SKButtonNode(defaultButtonImage: "blue_button_up", activeButtonImage: "blue_button_down" , buttonAction: startGame)

    startOptionsButton.position = CGPoint(x: 640, y: 210)
    startOptionsButton.activeButton.size = CGSize(width: 360, height: 95)
    startOptionsButton.defaultButton.size = CGSize(width: 360, height: 95)
    startOptionsButton.name = "startOptionsButton"

    let exitGameButton = SKButtonNode(defaultButtonImage: "blue_button_up", activeButtonImage: "blue_button_down" , buttonAction: startGame)

    exitGameButton.position = CGPoint(x: 640, y: 90)
    exitGameButton.activeButton.size = CGSize(width: 360, height: 95)
    exitGameButton.defaultButton.size = CGSize(width: 360, height: 95)
    exitGameButton.name = "exitGameButton"

    addChild(startGameButton)
    addChild(startOptionsButton)
    addChild(exitGameButton)


}
func exitGame() {

}

func startOptions(){

}

func startGame() {
    print("test")
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let location = touches.first!.locationInNode(self)
    let node = self.nodeAtPoint(location)
    print("test2")
    if (node.name == "startGameButton") {
        let currentNode = node as! SKButtonNode
        currentNode.activeButton.hidden = false
        currentNode.defaultButton.hidden = true
    }

}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let location = touches.first!.locationInNode(self)
    let node = self.nodeAtPoint(location)
    if (node.name == "startGameButton") {
        let currentNode = node as! SKButtonNode
        if currentNode.defaultButton.containsPoint(location) {
            currentNode.activeButton.hidden = false
            currentNode.defaultButton.hidden = true
        } else {
            currentNode.activeButton.hidden = true
            currentNode.defaultButton.hidden = false
        }
    }

}


override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let location = touches.first!.locationInNode(self)
    let node = self.nodeAtPoint(location)
    print("test3")
    if (node.name == "startGameButton") {
        let currentNode = node as! SKButtonNode
        if currentNode.defaultButton.containsPoint(location) {
            startGame()
        }
        currentNode.activeButton.hidden = true
        currentNode.defaultButton.hidden = false
    }
}
1
where (in your code) are touchesBegun, touchesMoved and touchesEnded located?Confused

1 Answers

1
votes

It looks like you're never actually running your button's action. All you're doing when the button is pressed in touchesBegan is setting the .hidden property to true or false. Try something like this:

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

    let location = touches.first!.locationInNode(self)
    let node = self.nodeAtPoint(location)

    print("test2")

    if (node.name == "startGameButton") {
        let currentNode = node as! SKButtonNode

        self.runAction(currentNode.action)

        currentNode.activeButton.hidden = false
        currentNode.defaultButton.hidden = true
    }
}