SKAction 抛物线运动

3

你好,我正在使用Sprite Kit进行工作,并尝试让一个精灵从一个点移动到另一个点。目前,我可以使用SkAction.moveTo实现这一点,精灵沿直线移动。然而,我想知道是否可能在精灵到达目的地时以抛物线方式移动。感谢您的帮助。


1
你可以构建任何CGPath,然后使用SKAction.followPath将其沿着该路径发送。 - user887210
如何使用CGPath创建一个抛物线? - Comrod33
要么使用抛物线的方程来生成点并将它们添加到CGPath中,要么按照这个链接(http://math.stackexchange.com/a/336679)计算贝塞尔曲线的控制点,并用它来创建一个CGPath。 - user887210
2个回答

7
这里有一种简单的方法来创建一个拱形的UIBezierPath:
let path = UIBezierPath()
path.moveToPoint(CGPointZero)
path.addQuadCurveToPoint(CGPoint(x: 100, y: 0), controlPoint: CGPoint(x: 50, y: 200))

当在Playground中绘制时,它看起来像这样:

enter image description here

要使你的精灵沿着这条路径移动,请使用以下代码:

mySprite.runAction(SKAction.followPath(path.CGPath, duration: 1.0))

为了微调抛物线,需要更改上述代码中的常量以更改路径。

1
我尝试过这样做,但是球只是飞出屏幕,我不太明白为什么。现在的代码如下:var controlPoint = CGPointMake((ball.position.x+location.x)/2, (ball.position.y+location.y)/2) var ballPath = UIBezierPath() ballPath.moveToPoint(ball.position) ballPath.addQuadCurveToPoint(location, controlPoint: CGPointZero) - Comrod33
@Comrod33 我能想到的唯一可能是你的物理世界/引擎导致了这种行为。 - erdekhayser
和我遇到的情况一样。在Objective C中,没有添加任何物理效果到项目中,只是使用[SKAction followPath: duration:],然而最后的位置却非常大(尽管我并没有使用那么大的数值...)。 - aramusss

0

我在这个问题上已经花了相当长的时间。我想分享一下我在SKAction中关于抛物线运动的经验。

这是适用于Swift 3的代码。

let path = UIBezierPath()
path.move(to: CGPoint(x:0, y:0))
path.addQuadCurve(to: CGPoint(x: 100, y: 0), controlPoint: CGPoint(x: 50, y: 200))

let parabolaAction = SKAction.follow(path.cgPath, duration: 1)

你的Sprite节点必须放置在特定的位置。

第二行表示Sprite节点将以x:0和y:0的方式移动。这是相对运动。我遇到困难的问题是因为考虑到点是新的绝对位置,但实际上并不是。

第三行表示Sprite节点将通过x:100,y:0的方式移动到一个新的位置,借助控制点。控制点是像erdekhayser所展示的顶部坐标。

如果你在路径中设置了Sprite节点位置+某个值的点,那么你的Sprite节点可能会超出场景范围。

希望这有助于理解UIBezierPath用于抛物线运动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接