Swift3 SpriteKit:以角度射击子弹

时间:2017-04-24 19:40:05

标签: swift3 sprite-kit

目前,我的应用程序中有一个敌​​人可以射击一颗子弹,它可以从敌人身上移动到任何x和y位置,它可能朝向屏幕底部 - 子弹的大小。这是一个SKAction,它只在敌人的轨迹中从上到下发生一次,这个轨迹都是随机的X位置。

我想做的是以4个不同的角度射出4颗子弹。 45,135,225和270度。

目前我的fireBullet功能如下:

func fireBullet() {
    let bullet = EnemyBullet(imageName: bulletImage, bulletSound: bulletSound)
    bullet.name = "Bullet"
    bullet.setScale(1)
    bullet.position = CGPoint(x: enemy.position.x, y: enemy.position.y - bullet.size.height)
    bullet.physicsBody = SKPhysicsBody.init(rectangleOf: bullet.size)
    bullet.physicsBody!.affectedByGravity = false
    bullet.physicsBody!.categoryBitMask = PhysicsCategories.enemy
    bullet.physicsBody!.collisionBitMask = PhysicsCategories.none
    bullet.physicsBody!.contactTestBitMask = PhysicsCategories.player
    gameScene.addChild(bullet)

    let moveBullet = SKAction.moveTo(y: -gameScene.size.height * 0.1, duration: bulletTimeInScreen)
    let deleteBullet = SKAction.removeFromParent()

    let bulletSequence = SKAction.sequence([moveBullet, deleteBullet])
    bullet.run(bulletSequence)
}

我假设我可以为bullet1更改子弹并重复bullet2,3和4.我可以使用zRotation将每个子弹旋转到该特定角度。

我无法弄清楚的是移动子弹的方向。具体来说,如何从敌人的位置找出SKAction.moveTo的X和Y.

我搜索并阅读过很多文章,但没有一篇可以指出我正确的方向。

1 个答案:

答案 0 :(得分:3)

我找到了一种方法可以做到这一点归功于KnightOfDragon的这篇文章Shoot bullet in the Direction the Ship is Facing Swift and Sprite Kit,顺便说一下,我用正确的三角学方向指出了我。

基本上我将变量名从bullet改为bullet1,并添加了bullet2,3和4,在同一个函数中更改了zRotation。 moveBullet1 SKAction以zRotation指向的方向发射子弹。

学位使用如下所示的扩展名。我不记得在这个网站的哪个地方找到了那个。

func fireBullet() {
    let bullet1 = EnemyBullet(imageName: bulletImage, bulletSound: bulletSound)
    bullet1.name = "Bullet"
    bullet1.setScale(scale)
    bullet1.position = CGPoint(x: enemy.position.x, y: enemy.position.y)
    bullet1.zRotation = CGFloat(45.degreesToRadians)
    bullet1.physicsBody = SKPhysicsBody.init(rectangleOf: bullet1.size)
    bullet1.physicsBody!.affectedByGravity = false
    bullet1.physicsBody!.categoryBitMask = PhysicsCategories.enemy
    bullet1.physicsBody!.collisionBitMask = PhysicsCategories.none
    bullet1.physicsBody!.contactTestBitMask = PhysicsCategories.player
    gameScene.addChild(bullet1)

    let moveBullet1 = SKAction.move(to: CGPoint(
        x: distance * cos(bullet1.zRotation) + bullet1.position.x,
        y: distance * sin(bullet1.zRotation) + bullet1.position.y),
        duration: bulletTimeInScreen)
    let deleteBullet1 = SKAction.removeFromParent()

    let bullet1Sequence = SKAction.sequence([moveBullet1, deleteBullet1])

    bullet1.run(bullet1Sequence)
}


extension Int {
    var degreesToRadians: Double { return Double(self) * .pi / 180 }
    var radiansToDegrees: Double { return Double(self) * 180 / .pi }
}

Four bullets shot in different directions.