雪碧套件中的之字形路径

Zig zac path in sprite kit

我希望精灵套件节点向右移动 200 像素,向左移动 400 像素,然后再次向右移动 400 像素,依此类推,直到离开屏幕

    var cgpath: CGMutablePathRef = CGPathCreateMutable();

    // random values
    var xStart: CGFloat = CGFloat(0.0);
    var xEnd: CGFloat = CGFloat(0.0);

    // ControlPoint1
    var cp1X: CGFloat = CGFloat(200.0);
    var cp1Y: CGFloat = CGFloat(400.0);

    // ControlPoint2
    var cp2X: CGFloat = CGFloat(200.0);
    var cp2Y: CGFloat = CGFloat(280.0);

    var s: CGPoint = CGPointMake(xStart,-self.frame.size.height/2);
    var e: CGPoint = CGPointMake(xEnd, self.frame.size.height/2);
    var cp1: CGPoint = CGPointMake(cp1X, cp1Y);
    var cp2: CGPoint = CGPointMake(cp2X, cp2Y);
    CGPathMoveToPoint(cgpath,nil, s.x, s.y);

    CGPathAddCurveToPoint(cgpath, nil, cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y);

    var ball:SKSpriteNode = SKSpriteNode(color: UIColor.redColor(), size: CGSizeMake(40, 40));

    var followTrack = SKAction.followPath(cgpath, asOffset: false, orientToPath: true, duration: 15.0);
    var forever: SKAction = SKAction.repeatActionForever(followTrack);
    ball.runAction(forever);
    self.addChild(ball);

    let shapeNode = SKShapeNode(path: cgpath)
    self.addChild(shapeNode);

尝试使用以下代码使用贝塞尔曲线获得之字形路径。

var cgpath: CGMutablePathRef = CGPathCreateMutable();

var xStart: CGFloat = CGFloat(200.0);
var xEnd: CGFloat = CGFloat(200.0);

var yStart : CGFloat = 0
var yEnd : CGFloat = self.size.height

let numberOfIntermediatePoints  = 10
let xOffset : CGFloat = 400
let intervalY = (yEnd - yStart)/CGFloat(numberOfIntermediatePoints)

var s: CGPoint = CGPointMake(xStart,yStart);
CGPathMoveToPoint(cgpath,nil, s.x, s.y);


for i in stride(from: 0, through: numberOfIntermediatePoints - 1, by: 1) {

    let yOff = intervalY * CGFloat(i) + yStart
    let controlPointInterval = intervalY/3

    var cp1X: CGFloat = CGFloat(xStart + xOffset);
    var cp1Y: CGFloat = CGFloat(yStart + yOff + controlPointInterval);

    var cp2X: CGFloat = CGFloat(xStart - xOffset);
    var cp2Y: CGFloat = CGFloat(yStart + yOff + controlPointInterval * 2);

    var e: CGPoint = CGPointMake(xEnd, yStart + yOff + intervalY);
    var cp1: CGPoint = CGPointMake(cp1X, cp1Y);
    var cp2: CGPoint = CGPointMake(cp2X, cp2Y);

    CGPathAddCurveToPoint(cgpath, nil, cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y);

}

var ball:SKSpriteNode = SKSpriteNode(color: UIColor.redColor(), size: CGSizeMake(40, 40));

var followTrack = SKAction.followPath(cgpath, asOffset: false, orientToPath: true, duration: 5.0);
var forever: SKAction = SKAction.repeatActionForever(followTrack);
ball.runAction(forever);
self.addChild(ball);

let shapeNode = SKShapeNode(path: cgpath)
self.addChild(shapeNode);

更改 numberOfIntermediatePointsxOffset 值以更改之字形的数量和每个之字形移动的距离量。