Как я могу выполнить действие при одновременном нажатии двух кнопок? - PullRequest
0 голосов
/ 20 января 2020

Я хочу, чтобы мой персонаж прыгал, когда я нажимаю две кнопки одновременно. Я уже пробовал это:

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

Ответы [ 2 ]

1 голос
/ 20 января 2020

Один из подходов будет следующим:

  • В ваших функциях, которые обнаруживают взаимодействие с кнопкой, подготовьте ее с логическим значением.
  • Затем в функции обновления используйте таймер для добавления диапазон времени, в котором мы можем сказать, что обе кнопки нажимаются одновременно (например, 100 мс).

Я приведу здесь некоторый псевдокод, который, я надеюсь, поможет.

    func RightBtnClick()->Void{
        rightBtnPressed = true
    }
    func LeftBtnClick()->Void{
        leftBtnPressed = true
    }

    func Start()->Void{
        rightBtnTimer = 0
        leftBtnTimer = 0
    }

    func Update(deltatime ms:float)->Void{
        if(rightBtnPressed){
            rightBtnTimer += ms;
            if(rightBtnTimer>100){
                rightBtnTimer = 0
                rightBtnPressed=false
            }
        }

        if(leftBtnPressed){
            leftBtnTimer += ms;
            if(leftBtnTimer>100){
                leftBtnTimer = 0
                leftBtnPressed=false
            }
        }

    // Lastly let's check if both are pressed.
        if(leftBtnPressed && rightBtnPressed){
            DoStuff()
        }
    }
0 голосов
/ 20 января 2020

Прежде всего, убедитесь, что в GameViewController.swift включена поддержка мультитач.

class GameViewController: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()

        // ...

        if let view = self.view as! SKView?
        {
            // ...

            view.isMultipleTouchEnabled = true
        }
    }
}

В GameScene дайте название вашим кнопкам. При нажатии мы создадим список каждого узла, к которому прикоснулись ваши пальцы, который имеет имя. Если список содержит как правую, так и левую кнопки, это означает, что он нажал обе кнопки одновременно.

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

Вы можете смоделировать мультитач внутри Simulator, удерживая кнопку Option.

...