2017-04-24 78 views
1

目前我的应用程序有一个敌人,射击子弹从敌人的任何X和Y位置,可能是朝着屏幕的底部 - 子弹的大小旅行。这是从上到下在敌方轨道上只发生一次的SKAction,这个轨迹都是随机的X位置。Swift3 SpriteKit:角度射击子弹

我想要做的是在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.

我已经搜索并阅读了很多文章,但没有一篇能够指出我正确的方向。

+0

您想了解如何工作ATAN2,基本上你要转换矩形坐标到极坐标 – Knight0fDragon

+0

@JoseCarrillo我建议你读raywenderlich.com HTTPS的精彩教程:// WWW。 raywenderlich.com/57368/trigonometry-game-programming-sprite-kit-version-part-1 –

回答

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.