代码之家  ›  专栏  ›  技术社区  ›  Jush KillaB

如何在swift中不断获取运动物体的x位置?

  •  1
  • Jush KillaB  · 技术社区  · 7 年前

    leftbutton, rightbutton SKSpriteNode() . 当用户触摸其中一个按钮时,只要用户保持触摸,就会有一条船左右移动。

    现在,我需要一个函数或任何其他东西来提供 ship.position.x 一直如此。我坚持要让它不断打印位置。我可以让它每次按下按钮都打印,但它只打印一次。

    在我的 didMove

    func moveShip (moveBy: CGFloat, forTheKey: String) {
        let moveAction = SKAction.moveBy(x: moveBy, y: 0, duration: 0.09)
        let repeatForEver = SKAction.repeatForever(moveAction)
        let movingSequence = SKAction.sequence([moveAction, repeatForEver])
        ship.run(movingSequence, withKey: forTheKey)
    } 
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("\(ship.position.x)")
    
        for touch: AnyObject in touches {
            let pointTouched = touch.location(in: self)
    
            if leftButton.contains(pointTouched) {
    
    //          !! I MAKE IT PRINT THE POSITION HERE !!
    
                moveShip(moveBy: -30, forTheKey: "leftButton")
            }
    
            else if rightButton.contains(pointTouched) {
                moveShip(moveBy: 30, forTheKey: "rightButton")
            }
        }
    }
    
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first{
            let pos = touch.location(in: self)
            let node = self.atPoint(pos)
    
            if node == aButton {
    
            } else {
                ship.removeAction(forKey: "leftButton")
                ship.removeAction(forKey: "rightButton")
            }
        }
    }
    

    在我的代码中,该位置仅在触摸开始时打印一次,并且在您释放触摸并再次触摸之前不会打印。有没有可能用我的代码做到这一点?

    4 回复  |  直到 7 年前
        1
  •  2
  •   junxi    7 年前

    这个 函数不会帮助您解决特定问题。您可以通过创建一个 var timer = Timer() 作为实例变量。

    然后,您必须设置计时器和在特定时间结束时调用的函数。 在您的应用程序中执行以下操作 didMove 功能:

    timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, 
            selector: #selector(detectShipPosition), userInfo: nil, repeats: true)
    

    由于这将每隔0.01秒重复一次,因此它将调用该函数 detectShipPosition 外部 didMove公司 .

    func detectShipPosition(){
        print("\(ship.position.x)")
    }
    
        2
  •  1
  •   Bharath    7 年前

    嗨,你可以利用 触摸移动 委托方法(当与事件相关的一个或多个触摸发生更改时,它会通知响应者。)如下所示,

        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
            print("\(ship.position.x)")
        }
    
        3
  •  1
  •   Vini App    7 年前

    你在Bharath回复上发表评论的解决方案。

    您可以使用自己的值更改以下内容:

    longGesture.minimumPressDuration
    

    您可以使用 UILongPressGestureRecognizer :

    class ViewController: UIViewController, UIGestureRecognizerDelegate {
        @IBOutlet weak var leftButton: UIButton!
        @IBOutlet weak var rightButton: UIButton!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let longGesture = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longPress(_:)))
            longGesture.minimumPressDuration = 0.5
            longGesture.delegate = self
            leftButton.addGestureRecognizer(longGesture)
    
            rightButton.addGestureRecognizer(longGesture)
    
        }
    
        @objc func longPress(_ gestureReconizer: UILongPressGestureRecognizer) {
            print("\(ship.position.x)")
        }
    }
    
        4
  •  0
  •   Alain T.    7 年前

    override func update(_ currentTime: TimeInterval) 
    {
        if let ship = theShipSprite,
           ship.position != lastPosition
        {
           print(ship.position) // or whatever it is you need to do
           lastPosition = shipPosition
        }
    }