我正在尝试创建一个八角形或无穷大符号的CGPath。我确实认为路径创建应该返回期望的结果,但是我仍然将其发布在这里:

let path = CGMutablePath()

path.addEllipse(in: CGRect(x: -height/4, y: -height/2, width: height/2, height: height/2))
path.addEllipse(in: CGRect(x: -height/4, y: 0.0, width: height/2, height: height/2))

path.closeSubpath()

return path

现在,我有另一个应该遵循此路径的节点,我认为这可以通过使用SKAction像这样工作:
highlighter.run(SKAction.repeatForever(SKAction.follow(shape.path!, asOffset: false, orientToPath: true, duration: 5.0)))

荧光笔是我的节点的名称,shape是我为其分配路径的SKShapeNode的名称。但是,该节点仅绘制一个圆,而不绘制所需的形状。我一直在搜索该问题,但找不到任何类似的案例,并且已经在此问题上待了一天,所以我可能看不到明显的东西。任何见解将不胜感激!

最佳答案

如果绘制生成的图8,您将看到精灵仅跟随底部圆,因为这是绘制路径的方式。

您需要从上/下到中间画上一个或下一个圆的一半,然后再添加一个完整的另一个圆,从中间开始并在中间结束,最后再将另一个圆返回到您开始的位置。

这是一个示例,该示例还绘制了要遵循的边界矩形和Figure-8路径:

class GameScene: SKScene {

    //    var sprite = SKSpriteNode()
    var figureEightPath = CGMutablePath()

    override func didMove(to view: SKView) {

        let boundingRect = CGRect(x: -200, y: -400, width: 400, height: 800)
        addChild(drawSKShapeNode(fromRect: rect, withWidth: 2, inColour: SKColor.green, called: "rect"))

        figureEightPath = drawFigureEight(in: boundingRect)
        addChild(drawSKShapeNode(fromPath: figureEightPath, withWidth: 2, inColour: SKColor.red, called: "path"))

        let sprite = SKSpriteNode(color: SKColor.yellow, size: CGSize(width: 50, height: 50))
        addChild(sprite)

        let moveAction = SKAction.follow(figureEightPath, asOffset: false, orientToPath: true, speed: 200)
        sprite.run(SKAction.repeatForever(moveAction))

    }

    func drawSKShapeNode(fromPath path: CGMutablePath,
                         withWidth width: CGFloat,
                         inColour colour: SKColor,
                         called name: String) -> SKShapeNode {

        let shape = SKShapeNode(path: path, centered: true)
        shape.lineWidth = width
        shape.strokeColor = colour
        shape.name = name
        return shape
    }

    func drawSKShapeNode(fromRect rect: CGRect,
                         withWidth width: CGFloat,
                         inColour colour: SKColor,
                         called name: String) -> SKShapeNode {

        let shape = SKShapeNode(rect: rect)
        shape.lineWidth = width
        shape.strokeColor = colour
        shape.name = name
        return shape
    }

    func drawFigureEight(in rect: CGRect) -> CGMutablePath {
        let bottomCentre = CGPoint(x: rect.midX, y: rect.height/4+rect.minY)
        let topCentre = CGPoint(x: rect.midX, y:(rect.height/4)*3+rect.minY)
        let radius = rect.height/4

        let bottom = CGPoint(x: rect.midX, y: rect.minY)

        let path = CGMutablePath()
        path.move(to: bottom)
//Draw a semi-circle from the bottom counter-clockwise to the middle
        path.addArc(center: bottomCentre, radius: radius, startAngle: CGFloat(Double.pi*1.5), endAngle: CGFloat(Double.pi/2), clockwise: false)
//Draw to top circle in a clockwise direction
        path.addArc(center: topCentre, radius: radius, startAngle: CGFloat(Double.pi*1.5), endAngle: CGFloat(-Double.pi/2), clockwise: true)
//Draw the rest of the bottom circle by drawing a semi-circle from the middle to the bottom counter-clockwise.
        path.addArc(center: bottomCentre, radius: radius, startAngle: CGFloat(Double.pi/2), endAngle: CGFloat(-Double.pi/2), clockwise: false)

        return path
    }

    override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered
    }
}

有几个辅助函数-drawSKShapeNode-您不需要,但对于调试非常有用,因为它们可以通过从给定的对象创建SKShapeNode来“绘制” CGPath或CGRect。

关于ios - SKAction followPath在两个圆圈(八个形状)下无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44239538/

10-13 09:27