在不从 CGPath 开头开始的情况下跟随带有 SKAction 的 CGPath

Posted

技术标签:

【中文标题】在不从 CGPath 开头开始的情况下跟随带有 SKAction 的 CGPath【英文标题】:Following a CGPath with SKAction without starting from beginning of CGPath 【发布时间】:2014-08-05 18:04:53 【问题描述】:

我有一个代表椭圆的 SKShape 节点。玩家被放置在基于椭圆的 CGPath 的 Bezier 路径的当前点上:

我有两个播放器节点可以执行的操作。玩家可以顺时针或逆时针跟随路径。

rotateCounterClockwiseAction = SKAction.followPath(counterClockwisePath.CGPath, asOffset: false, orientToPath: true, duration: 1)
rotateClockwiseAction = SKAction.followPath(clockwisePath.CGPath, asOffset: false, orientToPath: true, duration: 1)

当我开始一个动作时:

player.runAction(SKAction.repeatActionForever(rotateClockwiseAction), withKey: "ClockwiseRotation")

玩家沿着适当的路径和方向移动。当我停止其中一项操作时:

player.removeActionForKey("ClockwiseRotation")

玩家停在上次移动到的路径上。我希望能够从玩家的当前点开始任何一个动作,并遵循相同的路径,但是现在,如果我再次开始其中一个动作(在一个动作已经开始和停止之后),玩家会跳跃到与图片中相同的起点,然后从那里沿着路径前进。我怎样才能让玩家从它已经在的位置开始跟随路径?

【问题讨论】:

你必须创建一个新的 cgpath,形状相同,但从玩家所在的点开始 我用let ellipse = SKShapeNode (ellipseOfSize: CGSizeMake(size.0, size.1)) 创建了我的路径,即。这方面的经验不多。你有什么资源可以帮助我实现这一目标吗? 【参考方案1】:

您可以使用 SKNode 的speed 属性轻松实现此目的。

您可以通过调整速度值暂停和恢复动作,而不是删除和重新创建动作。这将使您的贝塞尔路径动画从其当前位置恢复。

// Set the player node's speed to 0.0 causing all actions to be paused.
[playerNode setSpeed:0.0];

...

// Then when you're ready to resume set the player node's speed back to 1.0.
// This will cause the action to continue from its current position.
[playerNode setSpeed:1.0];

【讨论】:

这不起作用,因为玩家节点有两个附加到他的动作。他可以向左旋转或向右旋转。如果他向左旋转而我暂停,我可以继续向左旋转,但如果我开始向右旋转,他将在路径的起点或最后一次向右旋转路径暂停的地方开始。 我明白了。很遗憾,您不能仅以 -1 的速度反转路径跟随动作。这样你只需要一个动作。我想我会倾向于在不使用 sin/cos 并跟踪当前轨道位置的情况下对轨道进行编码。 我已经让它根据玩家在圆圈上的当前位置重绘路径,我正在努力解决的是当路径是椭圆时重绘

以上是关于在不从 CGPath 开头开始的情况下跟随带有 SKAction 的 CGPath的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在不从 NSObject 继承类的情况下迅速采用协议?

如何在不从表单中删除数据的情况下重置 BootstrapValidator? [复制]

在不调整大小或重绘的情况下扩展 UIView

如何在不从磁盘中删除文件的情况下 git rm 文件? [复制]

如何在不从终端或任何编辑器执行的情况下运行 python 程序 [重复]

如何在不从 DataFrame 转换并访问它的情况下将列添加到 Dataset?