重复SKAction起始位置更改

时间:2016-03-26 12:32:52

标签: swift sprite-kit skaction cgpath

我有一个路径和一个SKShapeNode,并希望SKShapeNode永远遵循路径(Hexagon形状)。

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。所以如果你知道一个更好的方法,请告诉我。

1 个答案:

答案 0 :(得分:2)

这是asOffset参数的作用:

  

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

因此,根据我的理解,当我们将其设置为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))