Search code examples
iossprite-kitgame-engine

How can I make an action to occur when two buttons are pressed at the same time?


I want my character to jump whenever I press two buttons at the same time. I've already tried this:

if rightButton.contains(location) && leftButton.contains(location) {
    character.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 50))
}

Solution

  • First of all, make sure in GameViewController.swift you have multitouch enabled.

    class GameViewController: UIViewController
    {
        override func viewDidLoad()
        {
            super.viewDidLoad()
    
            // ...
    
            if let view = self.view as! SKView?
            {
                // ...
    
                view.isMultipleTouchEnabled = true
            }
        }
    }
    

    In GameScene give name to your buttons. On tap we will create a list of every node your fingers touched that has a name. If the list contains both right and left button, it means he pressed both at the same time.

    class GameScene: SKScene
    {
        override func didMove(to view: SKView)
        {
            // add name to each button
    
            left_button.name  = "left_button"
            right_button.name = "right_button"
        }
    
        func buttons_touched(_ touches: Set<UITouch>) -> [String]
        {
            // get the list of buttons we touched on each tap
    
            var button_list : [String] = []
    
            for touch in touches
            {
                let positionInScene = touch.location(in: self)
                let touchedNode = self.nodes(at: positionInScene)
    
                let buttons = touchedNode.compactMap { (node) -> String in
                    node.name ?? ""
                }.filter({$0 != ""})
    
                button_list += buttons
            }
    
            return button_list
        }
    
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
        {
            let buttons_tapped = buttons_touched(touches)
    
            if buttons_tapped.contains("right_button") && buttons_tapped.contains("left_button")
            {
                // jump code
            }
        }
    }
    

    You can simulate multitouch inside Simulator by holding Option button.