我正在开发一款游戏,其中有一个SKSpriteNode。我想,这个节点的位置一直在上下移动。一开始,它应该具有y值,例如500。然后它应该向下移动200 px(500 + 200 = 700)然后它应该向上移动400(700-400 = 300),因此它会像上下一样产生,一直在500 + 200到500-200之间移动。我希望我解释它是可以理解的。首先,我如何获得此效果,其次,我在哪里输入?我应该使用自定义功能吗?我用swift编程(newbie to swift)
答案 0 :(得分:4)
我写了一些示例代码,您可以根据自己的需要进行调整:
首先,振荡计算需要π:
// Defined at global scope.
let π = CGFloat(M_PI)
其次,扩展SKAction
,以便您可以轻松创建可以振荡相关节点的操作:
extension SKAction {
// amplitude - the amount the height will vary by, set this to 200 in your case.
// timePeriod - the time it takes for one complete cycle
// midPoint - the point around which the oscillation occurs.
static func oscillation(amplitude a: CGFloat, timePeriod t: Double, midPoint: CGPoint) -> SKAction {
let action = SKAction.customActionWithDuration(t) { node, currentTime in
let displacement = a * sin(2 * π * currentTime / CGFloat(t))
node.position.y = midPoint.y + displacement
}
return action
}
}
上面的displacement
来自用于位移的简谐运动方程。有关详细信息,请参阅here(它们的重新排列有点,但它的方程式相同)。
第三,将所有内容整合在SKScene
中:
override func didMoveToView(view: SKView) {
let node = SKSpriteNode(color: UIColor.greenColor(),
size: CGSize(width: 50, height: 50))
node.position = CGPoint(x: size.width / 2, y: size.height / 2)
self.addChild(node)
let oscillate = SKAction.oscillation(amplitude: 200,
timePeriod: 1,
midPoint: node.position)
node.runAction(SKAction.repeatActionForever(oscillate))
}
如果您需要在x轴上振荡节点,我建议在angle
方法中添加oscillate
参数,并使用sin
和cos
来确定节点应在每个轴上振荡多少。
希望有所帮助!