2017-01-24 2 views
3

В моей игре вы нажимаете в любом месте экрана, и пуля идет в этом направлении. Единственная проблема заключается в том, что вы можете стрелять так же быстро, как вы можете нажать. Есть ли способ добавить задержку после каждого выстрела. Поэтому я хотел бы стрелять, подождать 1 секунду, а затем стрелять. Вот мой код в контактах:Swift 3 Bullet Firing Delay

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

    guard let touch = touches.first else { 
     return 
    } 
    let touchLocation = touch.location(in: self) 

    //Set up initial location of bullet and properties 
    let bullet = SKSpriteNode(imageNamed: "bullet") 
    bullet.name = "Bullet" 
    bullet.position = player.position 
    bullet.setScale(0.75) 
    bullet.zPosition = 1 
    bullet.physicsBody = SKPhysicsBody(circleOfRadius: bullet.size.width/2) 
    bullet.physicsBody?.isDynamic = true 
    bullet.physicsBody?.categoryBitMask = PhysicsCategory.Projectile 
    bullet.physicsBody?.contactTestBitMask = PhysicsCategory.Monster 
    bullet.physicsBody?.collisionBitMask = PhysicsCategory.None 
    bullet.physicsBody?.usesPreciseCollisionDetection = true 

    //Determine offset of location to bullet 
    let offset = touchLocation - bullet.position 

    //Stops Bullet from shooting backwards 
    if (offset.y < 0) { return } 

    addChild(bullet) 

    //Get the direction of where to shoot 
    let direction = offset.normalized() 

    //Make it shoot far enough to be guaranteed off screen 
    let shootAmount = direction * 1000 

    //Add the shoot amount to the current position 
    let realDest = shootAmount + bullet.position 

    //Create the actions 

    if currentGameState == gameState.inGame { 
    let actionMove = SKAction.move(to: realDest, duration: 1.0) 
    let actionMoveDone = SKAction.removeFromParent() 
    bullet.run(SKAction.sequence([actionMove, actionMoveDone])) 
    } 

} 

Спасибо за любую помощь.

+0

Запустите таймер при выстреле пули. При следующем касании проверьте, прошел ли таймер второй. Если он есть, запустите и перезапустите таймер, иначе проигнорируйте. – SaylorTwift2

+0

Это просто, и это можно сделать несколькими способами. Один из способов - запустить действие с помощью ключа. Таким образом, вы запускаете пулю, затем выполняете действие на игроке, который длится секунду, и означает, что ваш стрельба заблокирована. Поэтому каждый раз, когда вы пытаетесь запустить пулю, вы проверяете, присутствует ли этот ключ действия на определенном узле. – Whirlwind

+0

Любой шанс, что у меня может быть код для любого метода? Извините, новичок здесь –

ответ

0

Вы можете взглянуть на реализацию ThrottleRxSwift за одно возможное решение. Дроссель используется для ограничения числа событий, созданных в определенном временном интервале:

let timeIntervalSinceLast: RxTimeInterval 

if let lastSendingTime = _lastSentTime { 
    timeIntervalSinceLast = now.timeIntervalSince(lastSendingTime) 
} 
else { 
    timeIntervalSinceLast = _parent._dueTime 
} 

let couldSendNow = timeIntervalSinceLast >= _parent._dueTime 

if couldSendNow { 
    self.sendNow(element: element) 
    return 
} 
1

Это более простой подход, основанный на использовании Дата:

var time = Date() 

func shoot(after timeInterval: Double) { 
    guard Date() - timeInterval > time else { 
     print("WAIT") 
     return 
    } 
    print("SHOOT") 
    time = Date() // reset the timer 
} 

// CALL THIS INSIDE touchesEnded 
shoot(after: 1) 

Просто изменить для ваших нужд: ]

+0

Так что я делаю переменную «время», а затем выполняю эту функцию, а затем, где я помещаю съемку (после: 1) в мои функции контактирования? Спасибо за помощь. Btw –

+0

Я положил все, но все равно. Я чувствую, что я глуп. –

0

Вы можете сделать это с помощью клавиш управления. Ключ действия - это строка, которая делает действие идентифицируемым.

Как его использовать в этом случае?

Как уже говорилось в комментариях, вы запускаете пулю, а затем запускаете действие с помощью ключа на определенном узле, который будет длиться одну секунду. Наличие этого ключа/действия означает, что оружие заблокировано. Поэтому каждый раз, когда вы пытаетесь запустить пулю, вы проверяете, присутствует ли этот ключ на определенном узле. Когда действие закончится, ключ также будет автоматически удален. Вот код:

import SpriteKit 

let kLockWeaponActionKey = "kLockWeaponActionKey" 

class GameScene: SKScene { 


    func shoot(atPoint targetLocation:CGPoint){ 

     // 1 check if weapon is unlocked, or return 
     guard self.action(forKey: kLockWeaponActionKey) == nil else { 

      print("Weapon locked") 

      return 
     } 

     let bullet = SKSpriteNode(color: .purple, size: CGSize(width: 20, height: 20)) 

     addChild(bullet) 

     let shoot = SKAction.move(to: targetLocation, duration: 3) 

     //2 shoot 
     bullet.run(shoot) 

     //3 lock weapon 
     self.run(SKAction.wait(forDuration: 1), withKey: kLockWeaponActionKey) 
    } 

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

     if let touch = touches.first { 

      let targetLocation = touch.location(in: self) 

      self.shoot(atPoint:targetLocation) 

     } 
    } 
} 

Если вы пытаетесь спам пули быстро, вы увидите журнал в консоли, которая гласит: «оружие заблокировано».