同时按下两个按钮时如何进行操作? [SpriteKit]

问题描述 投票:0回答:2

我希望我的角色在同时按下两个按钮时跳起来。我已经尝试过了:

if rightButton.contains(location) && leftButton.contains(location) {
    character.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 50))
}
ios sprite-kit game-engine
2个回答
0
投票

一种方法是:

  • 在检测到按钮交互作用的函数中,用布尔值准备它。
  • 然后在您的更新功能中,使用计时器添加一个时间范围,在该范围内我们可以说两个按钮被同时按下(例如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
投票

首先,请确保在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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.