2017-01-24 8 views
3

In meinem Spiel tippen Sie irgendwo auf dem Bildschirm und eine Kugel geht in diese Richtung. Das einzige Problem ist, dass Sie so schnell schießen können, wie Sie tippen können. Gibt es eine Möglichkeit, nach jedem Schuss eine Verzögerung hinzuzufügen? Also würde ich gerne schießen, 1 Sekunde warten und dann schießen. Hier ist mein Code in BerührungenEnge: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])) 
    } 

} 

Danke für jede Hilfe.

+0

Starten Sie einen Timer, wenn eine Kugel geschossen wird. Bei der nächsten Berührung prüfen Sie, ob der Timer eine Sekunde verstrichen ist. Wenn dies der Fall ist, schieße und starte den Timer neu oder ignoriere ihn. – SaylorTwift2

+0

Es ist einfach und kann auf verschiedene Arten erfolgen. Eine Möglichkeit wäre, eine Aktion mit einem Schlüssel auszuführen. Also feuern Sie eine Kugel und führen Sie dann eine Aktion für einen Spieler aus, die eine Sekunde dauert und bedeutet, dass Ihr Schuss gesperrt ist. Jedes Mal, wenn Sie versuchen, eine Kugel abzufeuern, überprüfen Sie, ob dieser Aktionsschlüssel auf einem bestimmten Knoten vorhanden ist. – Whirlwind

+0

Jede Chance, ich kann Code für beide Methoden haben? Sorry, ein Anfänger hier –

Antwort

0

Sie können einen Blick auf die Throttle Implementierung von RxSwift für eine mögliche Lösung werfen. Gas wird verwendet, um die Anzahl der Ereignisse in einem definierten Zeitintervall erstellt zu begrenzen:

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

Dies ist ein einfacher Ansatz, basierend auf der Verwendung von Datum:

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) 

nur für Ihre Bedürfnisse ändern: ]

+0

Also mache ich die Variable 'Zeit' dann mache diese Funktion dann wo setze ich den Shooting (; nach: 1) in meine Berührungen beendet Funktion? Danke für die Hilfe btw –

+0

Ich habe alles reingesteckt aber es ist immer noch das selbe. Ich fühle mich wie ich bin dumm. –

0

Sie können dies mit Aktionstasten tun. Ein Aktionsschlüssel ist eine Zeichenfolge, die eine Aktion identifizierbar macht.

Wie wird es in diesem Fall verwendet?

Wie ich bereits in den Kommentaren gesagt habe, feuern Sie eine Kugel, dann führen Sie eine Aktion mit einem Schlüssel, auf einem bestimmten Knoten, der eine Sekunde dauern wird. Ein Vorhandensein dieses Schlüssels/dieser Aktion bedeutet, dass die Waffe gesperrt ist. Jedes Mal, wenn Sie versuchen, eine Kugel abzufeuern, überprüfen Sie, ob dieser Schlüssel auf einem bestimmten Knoten vorhanden ist. Wenn die Aktion beendet ist, wird der Schlüssel automatisch entfernt. Hier ist der Code:

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) 

     } 
    } 
} 

Wenn Sie Spam-Kugeln versuchen schnell werden Sie ein Protokoll in der Konsole angezeigt, die sagt: „Waffe gesperrt“.