【问题标题】:Repeat SKAction starting position changes重复 SKAction 起始位置变化
【发布时间】:2016-07-14 02:50:01
【问题描述】:

我有一条路径和一个 SKShapeNode,并希望 SKShapeNode 永远跟随路径(六边形)。

let pathHexagon:SKShapeNode = SKShapeNode()
let player:SKShapeNode = SKShapeNode()

pathHexagon.path = playerHexagonPath(pathHexRadius)
pathHexagon.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
pathHexagon.strokeColor = UIColor.blackColor()
pathHexagon.lineWidth = 5
addChild(pathHexagon)

player.path = playerPath(playerSize)
player.position = CGPoint(x: CGRectGetMidX(frame), y:CGRectGetMidY(frame))
player.strokeColor = UIColor.blackColor()
player.fillColor = UIColor.blackColor()
addChild(player)

let action = SKAction.followPath(playerHexagonPath(pathHexRadius), speed: CGFloat(300.0))
player.runAction(SKAction.repeatActionForever(action))

它有点工作,但起始位置每个周期都会改变:

http://recordit.co/lEcLxs4DoD

为什么会这样?

最终我想将此动画链接到用户输入。作为练习,我正在尝试复制 Super Hexagon。因此,如果您知道更好的方法,也请告诉我。

【问题讨论】:

  • 您必须使用+ followPath:asOffset:orientToPath:speed: 方法并将offset 参数设置为false。调用+ followPath: speed:方法相当于调用followPath:asOffset:orientToPath:speed:方法,同时将true传入offsetorient参数。
  • 我已经发布了类似的答案here
  • @Whirlwind 谢谢。这确实导致它不再在每个周期都移动。然而,它现在移动到屏幕外的某个地方(到左下角)。所以现在的起始位置似乎是错误的。禁用 player.position 无效。
  • 我不知道你的其余代码是什么样子的。此外,我现在没有时间尝试您的示例,但如果您可以编辑您的问题,以便我可以复制并粘贴它以重现该问题,我稍后可能会提供帮助。
  • 感谢您的麻烦:我已经上传到 GitHub:github.com/farayman3/HexagonPractice

标签: swift sprite-kit skaction cgpath


【解决方案1】:

这就是asOffset 参数的作用:

@param asOffset 如果是,路径中的点是相对偏移量 节点的起始位置。如果否,则节点中的点是绝对的 坐标值。

所以据我了解,当我们将其设置为 false 时,路径中的点是节点父级坐标系中的绝对坐标值。

你可以做两件事来让它工作:

1) 制作一个容器并添加一个播放器

2) 更改场景的锚点,但我怀疑这是否适合您,因为您必须重新定位所有内容。

可能还有其他几种方法可以解决这个问题,但我自己没有尝试过。

选项 1:

  let container = SKNode()
  player.path = playerPath(playerSize)
  player.position = CGPoint(x: 0, y: 0)
  player.strokeColor = UIColor.blackColor()
  player.fillColor = UIColor.blackColor()
  container.addChild(player)
  container.position = CGPoint(x:frame.midX, y:frame.midY)
  addChild(container)

  let action = SKAction.followPath(pathHexagon.path!, asOffset: false, orientToPath: true, speed: CGFloat(300.0))
  player.runAction(SKAction.repeatActionForever(action))

或者,选项二:

self.anchorPoint = CGPoint(x:0.5, y:0.5)

 mainHexagon.path = hexagonPath(mainHexRadius)
 mainHexagon.strokeColor = UIColor.redColor()
 mainHexagon.lineWidth = 10
 addChild(mainHexagon)

 pathHexagon.path = playerHexagonPath(pathHexRadius)
 pathHexagon.strokeColor = UIColor.blackColor()
 pathHexagon.lineWidth = 5
 addChild(pathHexagon)

 player.path = playerPath(playerSize)
 player.position = CGPoint(x: 0, y: 0)
 player.strokeColor = UIColor.blackColor()
 player.fillColor = UIColor.blackColor()
 addChild(player)

 let action = SKAction.followPath(pathHexagon.path!, asOffset: false, orientToPath: true, speed: CGFloat(300.0))
 player.runAction(SKAction.repeatActionForever(action))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多