2016-09-28 2 views
2

В моей игре я использую SKActions в последовательности для перемещения узла (весла в этом случае) в определенное место и обратно, эта часть работает нормально. Весла перемещается всякий раз, когда пользователь прикасается к ней на экране. Мой код это выглядит следующим образом:Swift - После того, как узел коснулся задержки до тех пор, пока его не коснется снова

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    let touch = touches.first! 
    let touchLocation = touch.location(in: self) 
    let nodeTouched:SKPhysicsBody? = self.physicsWorld.body(at: touchLocation) 
    let ballNode = self.childNode(withName: ballName) 

    if nodeTouched?.node?.name == RpaddleName { 

     if !paddleRTouched { 
      paddleRTouched = true 
      let Rpaddle = self.childNode(withName: RpaddleName) as! SKSpriteNode 
      let startPosition = CGPoint(x: 301.7, y: 87) 
      let newPosition = CGPoint(x: 226.7, y: 87) 
      let moveToNew = SKAction.move(to: newPosition, duration: 0.5) 
      let moveToOld = SKAction.move(to: startPosition, duration: 0.5) 
      let delay = SKAction.wait(forDuration: 0.5) 
      let sequence = SKAction.sequence([moveToNew,delay,moveToOld]) 
      Rpaddle.run(sequence) 
      paddleRTouched = false 

Однако мне нужно создать 5-секундную задержку, во время которой лопатка не может быть перемещен, если тот, кто прикасается (например отключение в течение определенного периода времени). Как я могу это сделать?

ответ

0

Remove он последняя строка кода выше:

paddleRTouched = false 

... и заменить его чем-то сродни этим:

let allowPaddleTouchAction = SKAction.run { 
     self.paddleRTouched = false 
    } 
    let allowTouchDelay = SKAction.wait(forDuration: 5) 
    run(SKAction.sequence([allowTouchDelay, allowPaddleTouchAction])) 
+0

благодаря работал отлично –

1

Я дал бы альтернативу хорошей T. Benjamin Larsen answer's, которые могли бы быть полезным в часто встречающихся ситуациях, вы можете использовать SKTUtilslibrary с расширениями SKAction:

public extension SKAction { 
    /** 
    * Performs an action after the specified delay. 
    */ 
    public class func afterDelay(_ delay: TimeInterval, performAction action: SKAction) -> SKAction { 
     return SKAction.sequence([SKAction.wait(forDuration: delay), action]) 
    } 

    /** 
    * Performs a block after the specified delay. 
    */ 
    public class func afterDelay(_ delay: TimeInterval, runBlock block: @escaping() -> Void) -> SKAction { 
     return SKAction.afterDelay(delay, performAction: SKAction.run(block)) 
    } 
} 

Так что, когда вам нужно выполнить действие после определенной задержки вы можете сделать прямо:

run(SKAction.afterDelay(5, runBlock: { 
    self.paddleRTouched = false 
})) 
Смежные вопросы