如何在我的游戏中发射子弹时点击时添加延迟

时间:2017-05-27 19:19:24

标签: ios swift xcode swift3 sprite-kit

我在这个问题上需要帮助,在我的游戏中,当一个节点被点击子弹被解雇时,但问题是我可以持续点击并且很多子弹开火,我想添加一些延迟到射击。

这是我的触摸开始代码

    for touch: AnyObject in touches{
        let pointOfTouch = touch.location(in:self)

        if player1.contains(pointOfTouch) {
            fireBullet1()
        }

        if player2.contains(pointOfTouch) {
            fireBullet2()
        }

        if player3.contains(pointOfTouch) {
            fireBullet3()
        }
    }
  }
}
func fireBullet1() {

    let bullet = SKSpriteNode(imageNamed: "b")
    bullet.position = player1.position
    bullet.zPosition = 1
    self.addChild(bullet)

    let moveBullet = SKAction.moveTo(y: self.size.height + bullet.size.height, duration: 1)
    let deleteBullet = SKAction.removeFromParent()
    let bulletSequence = SKAction.sequence([moveBullet, deleteBullet])
    bullet.run(bulletSequence)



}

func fireBullet2 () {

    let bullet2 = SKSpriteNode(imageNamed: "b")
    bullet2.position = player2.position
    bullet2.zPosition = 1
    self.addChild(bullet2)

    let moveBullet = SKAction.moveTo(y: self.size.height + bullet2.size.height, duration: 1)
    let deleteBullet = SKAction.removeFromParent()
    let bulletSequence = SKAction.sequence([moveBullet, deleteBullet])
    bullet2.run(bulletSequence)





}

func fireBullet3() {

    let bullet3 = SKSpriteNode(imageNamed: "b")
    bullet3.position = player3.position
    bullet3.zPosition = 1
    self.addChild(bullet3)


    let moveBullet = SKAction.moveTo(y: self.size.height + bullet3.size.height, duration: 1)
    let deleteBullet = SKAction.removeFromParent()
    let bulletSequence = SKAction.sequence([moveBullet, deleteBullet])
    bullet3.run(bulletSequence)



}

2 个答案:

答案 0 :(得分:1)

在Swift 2和Objective-C中查找TimerNSTimer。)

这个想法如下:

为每位玩家的枪提供gunXEnabled Bool。最初将每个Bool设置为true。

让您的fireBullet1()方法检查gun1Enabled。如果是假的,什么也不做。

如果gun1Enabled == true,请开枪,设置gun1Enabled = false,然后启动一个计时器,一旦发射,它将重新启用该枪:

Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) {
  (timer) -> Void) in
  gun1Enabled = true
}

我给了你一个不熟悉的部分,创造了计时器。看看你是否可以解决剩下的问题,如果没有,请在代码中发布有关哪些内容无效的信息。

答案 1 :(得分:1)

声明标志以立即禁用多次触发

let minFireDelay = 0.5

var allowsFire1 = true
var allowsFire2 = true
var allowsFire3 = true

更新触摸开始

for touch: AnyObject in touches {

    let pointOfTouch = touch.location(in:self)

    if allowsFire1 && player1.contains(pointOfTouch) {
        fireBullet1()
        // disable firing temporarily
        allowsFire1 = false
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + minFireDelay) { 
           allowsFire1 = true
        }
    }

    if allowsFire2 && player2.contains(pointOfTouch) {
        fireBullet2()
        // disable firing temporarily
        allowsFire2 = false
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + minFireDelay) { 
           allowsFire2 = true
        }
    }

    if allowsFire3 && player3.contains(pointOfTouch) {
        fireBullet3()
        // disable firing temporarily
        allowsFire3 = false
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + minFireDelay) { 
           allowsFire3 = true
        }
    }
}