【问题标题】:How can I rotate Spritenode while moving to face always forward?如何在始终向前移动时旋转 Spritenode?
【发布时间】:2018-03-02 14:54:22
【问题描述】:

我有这段代码对子弹节点施加力并使其向敌人移动。这种情况下火箭总是面朝上。 我的问题是如何旋转这个子弹以面向节点所在的方向。

  let asd=SKSpriteNode(imageNamed: "nuke")
    asd.zPosition=3
    asd.setScale(0.1)
    asd.position=CGPoint(x: self.size.width*0.945, y: self.size.height*0.48)

   asd.physicsBody=SKPhysicsBody(rectangleOf: asd.size)
    asd.physicsBody?.affectedByGravity=true
    asd.physicsBody?.isDynamic=true

    self.addChild(asd)
    let scale=SKAction.scale(to: 0.4, duration: 0.5)

    asd.physicsBody?.applyForce(CGVector(dx: -63, dy: 130))
    let wait=SKAction.wait(forDuration: 10)
    let rem=SKAction.removeFromParent()
    let seq=SKAction.sequence([scale,wait,rem])
    asd.run(seq)
}

【问题讨论】:

标签: swift animation sprite-kit rotation game-physics


【解决方案1】:

旋转是 zRotation 属性。

self.zRotation = <angle>

您必须首先确定使用一些基本触发设置的角度。

角度以弧度为单位,逆时针旋转,所以...

bullet 12 o'clock = 0
bullet  9 o'clock = pi/2
bullet  6 o'clock = pi
bullet  3 o'clock = pi * 3 / 2

【讨论】:

  • 问题是角度随着时间而变化。子弹的轨迹就像一条抛物线。我怎样才能实现随时间变化的角度?
  • 在您的更新方法中,根据所需方向计算角度,并在每一步应用 zRotation。或者如果太频繁,也许不是每一步,但你可以像每隔一定数量的帧或其他东西那样做。
  • 我设法通过你的视线施加了移动限制。谢谢@Dennis
【解决方案2】:

获取速度属性(速度向量)并从中计算一个角度,然后将该角度与 zRotation 属性相关联。比如:

func didSimulatePhysics() {
  if let pb = bullet.physicsBody {
    bullet.zRotation = atan2(pb.velocity.dy, pb.velocity.dx)
}

提供的项目符号是指正在运行的项目符号...

注意:我使用didSimulatePhysics 来确保所有物理计算都已经完成,从而速度向量是正确的。

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多