【问题标题】:Applying an impulse to bullets对子弹施加脉冲
【发布时间】:2016-07-08 01:13:10
【问题描述】:

我有一个可以移动和旋转的玩家 (SKSpriteNode),我想从他身上射出五颗子弹,但角度不同。我使用此代码:

let sinus = sin(player.zRotation)
let cosinus = cos(player.zRotation)

bullet.physicsBody!.applyImpulse(CGVector(dx: -sinus * 100, dy: cosinus * 100))

但是,我不知道如何正确设置带角度的矢量。我试着做这样的事情:

谁能帮帮我!

【问题讨论】:

  • 您熟悉极坐标吗?如果您要考虑在极坐标中作为方位角旋转需要做什么,那么您可以在最后一点转换回直角坐标以便传递给函数

标签: swift sprite-kit trigonometry skspritenode


【解决方案1】:

根据这张图:

您必须更改子弹的zRotation

请记住,zRotation 以弧度表示,因此如果需要:

extension CGFloat {
    var radiansToDegrees: CGFloat {
        return self * CGFloat(180.0 / M_PI)
    }
    var degreesToRadians: CGFloat {
        return self * CGFloat(M_PI / 180.0)
    }
}

你也可以使用来旋转你的子弹(这个也是用弧度表示的):

let rotate = SKAction.rotateByAngle(angle, duration: 0.01)

您还可以计算子弹冲量的速度和角度:

extension CGVector {
    func speed() -> CGFloat {
        return sqrt(dx*dx+dy*dy)
    }
    func angle() -> CGFloat {
        return atan2(dy, dx)
    }
}

如果您需要,您可以将这些元素与屏幕触摸连接起来,详细说明here

关于你的 cmets,你可以使用这个公式(已经在我的链接中解释过):

let angle = atan2(location.y - cannon.position.y , location.x - cannon.position.x)
cannon.zRotation = angle - CGFloat(M_PI_2)

【讨论】:

  • 那么我需要做什么,射击我的子弹?
  • 拍摄时你可以随心所欲地施加冲动
  • 我问怎么给冲动加角度