射击游戏中的自动射击(Swift 4-SpriteKit)

射击游戏中的自动射击(Swift 4-SpriteKit),swift,sprite-kit,sprite,skaction,Swift,Sprite Kit,Sprite,Skaction,我正在用Xcode做一个游戏项目。 我已经写了让飞船发射炮弹的代码,但我不知道用什么函数让飞船自动发射 你能帮我吗?提前谢谢你 这是我的代码,来自游戏场景: override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { let projectile = SKSpriteNode(imageNamed: "projectile") projectile.zPosition

我正在用Xcode做一个游戏项目。 我已经写了让飞船发射炮弹的代码,但我不知道用什么函数让飞船自动发射

你能帮我吗?提前谢谢你

这是我的代码,来自游戏场景:

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

    let projectile = SKSpriteNode(imageNamed: "projectile")
    projectile.zPosition = 1
    projectile.position = CGPoint(x: player.position.x, y: player.position.y)

    projectile.physicsBody = SKPhysicsBody(circleOfRadius: projectile.size.width/2)
    projectile.physicsBody?.isDynamic = true
    projectile.physicsBody?.categoryBitMask = PhysicsCategory.Projectile
    projectile.physicsBody?.contactTestBitMask = PhysicsCategory.Monster
    projectile.physicsBody?.collisionBitMask = PhysicsCategory.None
    projectile.physicsBody?.usesPreciseCollisionDetection = true
    self.addChild(projectile)
    let action = SKAction.moveTo(x: self.frame.width + projectile.size.width, duration: 0.5)

    projectile.run(action, completion: {
        projectile.removeAllActions()
        projectile.removeFromParent()
    })

}
override func touchesend(touch:Set,带有事件:UIEvent?){
let Sprojection=SKSpriteNode(图像名为“射弹”)
0.zPosition=1
射弹.position=CGPoint(x:player.position.x,y:player.position.y)
射弹.physicsBody=SKPhysicsBody(圆形半径:射弹.尺寸.宽度/2)
射弹.physicsBody?.isDynamic=真
射弹.physicsBody?.categoryBitMask=物理类别.射弹
投射物.physicsBody?.contactTestBitMask=PhysicsCategory.Monster
射弹.physicsBody?.collisionBitMask=PhysicsCategory.None
射弹.physicsBody?.usesPreciseCollisionDetection=true
self.addChild(投射物)
let action=SKAction.moveTo(x:self.frame.width+sparket.size.width,持续时间:0.5)
抛射。运行(动作、完成:{
抛射物。removeAllActions()
projective.removeFromParent()
})
}

根据杰克的评论,我假设你希望飞船“自动”发射,而不是在按住手指的同时重复发射

您可以使用“更新”功能控制自动拍摄。在我的示例中,update命令每1秒触发一次

private var updateTime: Double = 0

override func update(_ currentTime: TimeInterval) {

    if updateTime == 0 {
        updateTime = currentTime
    }

    if currentTime - updateTime > 1 {
        self.shoot()
        updateTime = currentTime
    }
}

func shoot() {

    let projectile = SKSpriteNode(imageNamed: "projectile")
    projectile.zPosition = 1
    projectile.position = CGPoint(x: player.position.x, y: player.position.y)

    projectile.physicsBody = SKPhysicsBody(circleOfRadius: projectile.size.width/2)
    projectile.physicsBody?.isDynamic = true
    projectile.physicsBody?.categoryBitMask = PhysicsCategory.Projectile
    projectile.physicsBody?.contactTestBitMask = PhysicsCategory.Monster
    projectile.physicsBody?.collisionBitMask = PhysicsCategory.None
    projectile.physicsBody?.usesPreciseCollisionDetection = true
    self.addChild(projectile)
    let action = SKAction.moveTo(x: self.frame.width + projectile.size.width, duration: 0.5)

    projectile.run(action, completion: {
        projectile.removeAllActions()
        projectile.removeFromParent()
    })
}

根据杰克的评论,我假设你希望飞船“自动”开火,而不是在按住手指的同时重复

您可以使用“更新”功能控制自动拍摄。在我的示例中,update命令每1秒触发一次

private var updateTime: Double = 0

override func update(_ currentTime: TimeInterval) {

    if updateTime == 0 {
        updateTime = currentTime
    }

    if currentTime - updateTime > 1 {
        self.shoot()
        updateTime = currentTime
    }
}

func shoot() {

    let projectile = SKSpriteNode(imageNamed: "projectile")
    projectile.zPosition = 1
    projectile.position = CGPoint(x: player.position.x, y: player.position.y)

    projectile.physicsBody = SKPhysicsBody(circleOfRadius: projectile.size.width/2)
    projectile.physicsBody?.isDynamic = true
    projectile.physicsBody?.categoryBitMask = PhysicsCategory.Projectile
    projectile.physicsBody?.contactTestBitMask = PhysicsCategory.Monster
    projectile.physicsBody?.collisionBitMask = PhysicsCategory.None
    projectile.physicsBody?.usesPreciseCollisionDetection = true
    self.addChild(projectile)
    let action = SKAction.moveTo(x: self.frame.width + projectile.size.width, duration: 0.5)

    projectile.run(action, completion: {
        projectile.removeAllActions()
        projectile.removeFromParent()
    })
}

开始触摸时,您可以调用函数开始拍摄,并每0.x秒重复一次。在结束时,您可以使计时器无效。首先是将投射代码移动到它自己的函数中。在开始触摸时,你可以调用一个函数开始拍摄,并每0.x秒重复一次。在结束时,您可以使计时器无效。首先是将投射代码移动到它自己的函数中。不客气。那么请把这个答案标记为正确,这样其他人就可以从这个问题中受益了。不客气。那么请将这个答案标记为正确,以便其他人可以从这个问题中受益