Swift3 SpriteKit : Shooting bullets at angles

标签 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)
}

我假设我可以更改项目符号 1 的项目符号并重复更改项目符号 2、3 和 4。这样我就可以使用 zRotation 将每个项目符号旋转到该特定角度。

我不知道子弹要朝哪个方向移动。具体来说,如何从敌人当时的位置算出SKAction.moveTo的X和Y。

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

最佳答案

多亏了这篇文章,我找到了一种方法 Shoot bullet in the Direction the Ship is Facing Swift and Sprite Kit作者:KnightOfDragon 顺便说一下,它用三角学为我指明了正确的方向。

基本上,我将变量名称从项目符号更改为项目符号1,并添加了项目符号2、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.

关于Swift3 SpriteKit : Shooting bullets at angles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43596422/

相关文章:

ios - 自定义操作表

ios - 在 watchOS 上以编程方式触发 segue

ios - 闭包无法隐式捕获变异的 self 参数

ios - 以编程方式创建可滚动下拉菜单(iOS/Swift)

ios - CUI目录 : Invalid Request: requesting subtype without specifying idiom

ios - 有没有办法在不依赖帧速率的情况下对游戏进行编程?

ios - 如何将任何 View 置于从代码获取其位置的任何其他 View 下方

ios - 更改用户角色

swift - 如何在整个游戏中的多个位置添加治疗节点?

ios - 使用 swift 查找 SKNode 的相对 Y 位置