【问题标题】:Rotating a sprite towards a point and move it towards it with a duration将精灵旋转到一个点并在一段时间内将其移向该点
【发布时间】:2017-08-01 03:52:10
【问题描述】:

所以如果我有类似的东西:

class game: SKScene {
    let sprite = SKSpriteNode(imageNamed: "sprite")
}

我如何制作一个点/精灵/形状,它首先会朝它旋转,然后朝它(而不是向它)移动,持续时间为 1 秒。

【问题讨论】:

  • 如果你想让它移动,而不是移动,那么你使用 moveBy。不移动到

标签: swift sprite-kit touch


【解决方案1】:

看下面的代码

让我们定义你的精灵和目标点

let sprite = SKSpriteNode(imageNamed: "mario.png")
let destPoint = CGPoint(x: 10, y: 10)

现在让我们定义 2 个向量。第一个 (v1) 是一个垂直向量。第二个(v2)代表你的精灵和你的目标点的增量空间

let v1 = CGVector(dx:0, dy:1)
let v2 = CGVector(dx:destPoint.x - sprite.position.x, dy: destPoint.y - sprite.position.y)

现在我计算这两个向量之间的角度

let angle = atan2(v2.dy, v2.dx) - atan2(v1.dy, v1.dx)

并将其分配给精灵

sprite.zRotation = angle

扩展

我将代码封装在一个扩展中

extension SKNode {
    func rotateVersus(destPoint: CGPoint) {
        let v1 = CGVector(dx:0, dy:1)
        let v2 = CGVector(dx:destPoint.x - position.x, dy: destPoint.y - position.y)
        let angle = atan2(v2.dy, v2.dx) - atan2(v1.dy, v1.dx)
        zRotation = angle
    }
}

所以现在你可以做

let sprite = SKSpriteNode(imageNamed: "mario.png")
sprite.rotateVersus(CGPoint(x: 10, y: 10))

旋转+移动扩展

对于后跟移动动画的旋转动画,您可以使用此扩展程序

extension SKNode {
    func rotateVersus(destPoint: CGPoint, durationRotation: NSTimeInterval, durationMove: NSTimeInterval) {
        let v1 = CGVector(dx:0, dy:1)
        let v2 = CGVector(dx:destPoint.x - position.x, dy: destPoint.y - position.y)
        let angle = atan2(v2.dy, v2.dx) - atan2(v1.dy, v1.dx)

        let rotate = SKAction.rotateToAngle(angle, duration: durationRotation)
        let move = SKAction.moveBy(CGVector(dx: v2.dx * 0.9, dy: v2.dy * 0.9), duration: durationMove)
        let sequence = SKAction.sequence([rotate, move])
        self.runAction(sequence)
    }
}

感谢维基百科image

【讨论】:

  • 你在这里只回答了一半问题
  • @Knight0fDragon:更新!
  • 有没有办法让它改变旋转的方向,所以如果它必须旋转359度,它不会顺时针旋转359度,而是逆时针旋转1度?
  • @Asphys:是的,只需使用SKAction.rotateToAngle(angle, duration: durationRotation, shortestUnitArc: true)
  • @Asphys:这完全取决于duration 参数。例如。如果您指定 3 秒作为持续时间并且目标点很近,它会变慢。如果距离越大,它会走得越快,因为持续时间总是 3 秒。因此,如果您想要恒定速度,则需要相应地更改持续时间。我希望我说清楚了
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多