目前,我的应用程序中有一个敌人可以射击一颗子弹,它可以从敌人身上移动到任何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.
我搜索并阅读过很多文章,但没有一篇可以指出我正确的方向。
答案 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 }
}