我有一个路径和一个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))
它有点工作,但起始位置在每个周期都会改变:
为什么会这样?
最终我想将此动画链接到用户输入。作为练习,我试图复制Super Hexagon。所以如果你知道一个更好的方法,请告诉我。
答案 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))