0

我正在研究如何最好地绕过拐角,CGPathRef这样当我召唤SKAction -followPath:asOffset:orientToPath:duration:我的僵尸时,它会平滑地在拐角处进行动画处理,而不是每次小家伙拐角时都会折断 90 度。网络上(和 SO)似乎有一些关于使用 Catmull-Rom 样条线的解决方案,我在做 3D 动画时很熟悉这些样条线。

我的问题:是否有人知道添加圆角的简单方法,实现 Catmull-Rom 似乎有点超出我的需要。

其次:如果它确实需要是 Catmull-Rom 有多容易。很难将结果曲线恢复为 aCGPathRef以便我可以将其输入到我的SKAction?

注意:路径是由一个简单的 A* 实现生成的,该实现存储了许多 CGPoint [x,y] 路点,然后我想将其用作路径的基础。如果可能的话,我不想使用贝塞尔曲线,因为我想让新路径靠近瓷砖中心线以避免可碰撞的物体。当我几乎到达初始路径近似所需的位置时,我也不想开始计算船体的 ctrl 点。

在此处输入图像描述

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, [[[self pathArray] firstObject] position].x, [[[self pathArray] firstObject] position].y);
    [[self pathArray]enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if(idx != 0) {
            CGPathAddLineToPoint(path, NULL, [obj position].x, [obj position].y);
        }
    }];

    SKAction *pathAction = [SKAction followPath:path asOffset:NO orientToPath:YES duration:[[self pathArray] count]/2];
    [[self zombie] runAction:pathAction];
4

1 回答 1

1

CGPath有许多生产曲线的设施。你绝对不需要自己实现 Catmull-Rom 或类似的。(如果CGPath您不方便,您可以使用更高级别UIBezierPath并从中CGPathRef受益。)

对于您的应用程序,最简单的选择可能是CGPathAddArcToPoint. 当然,您需要扩展循环以确定何时需要转弯而不是直线。然后不是在新正方形的中间添加一条线,而是在它的边缘添加一条线,然后是一个弧,它(x1, y1)是正方形的中间,(x2, y2)是线应该退出正方形的边缘,并且radius是宽度的一半正方形。

于 2013-12-16T20:18:08.713 回答