2016-06-17 17 views
0

Ich mache ein kleines Spiel mit swift und spritekit und ich arbeite gerade an dem Menü und habe eine eigene Buttonclass namens SKButtonNode als Button erstellt, die eine Unterklasse von SKNode ist. Wenn ich auf den Button auf meinem Handy klicke, passiert nichts, auch wenn ich "userInteractionEnabled = true" verwende. Warum kann ich dann nicht "test2" sehen, wenn ich einen Knopf berühre, sondern nur, wenn ich neben einem Knopf klicke?Swift/Spritekit SKNode bei Berührung nicht erkannt

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

wo (in Ihrem Code) sind BerührungenBegun, touchesMoved und touchesEnded lokalisiert? – Confused

Antwort

1

Es sieht so aus, als würden Sie nie wirklich die Aktion Ihres Knopfes ausführen. Alles, was Sie tun, wenn Sie die Taste touchesBegan drücken, ist das Setzen der .hidden-Eigenschaft auf true oder false. Versuchen Sie etwas wie folgt:

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

Ich komme nie in die BerührungenBegan Methode, das ist mein Problem – Mikinho90

+0

Haben Sie eine Druckanweisung oder einen Haltepunkt an der Spitze der BerührungenBegan-Methode, um sicher zu sein? – claassenApps

Verwandte Themen