ios - 平滑路径角以与 SKAction followPath 一起使用

标签 ios sprite-kit skaction

我正在研究如何最好地圆化 CGPathRef 上的角,以便当我调用 SKAction -followPath:asOffset:orientToPath:duration: 我的僵尸会平滑地绕过拐角,而不是每次小家伙拐过一个拐角时就突然旋转 90 度。网络上似乎有一些关于使用 Catmull-Rom 样条线的解决方案(以及 SO),我在 3D 动画中熟悉使用这些样条线。

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

其次:如果确实需要 Catmull-Rom,那么将结果曲线返回到 CGPathRef 中有多容易,以便我可以将其输入我的 SKAction?

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

enter image description here

    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];

最佳答案

CGPath有许多用于生成曲线的工具。您绝对不需要自己实现 Catmull-Rom 或类似的。 (如果 CGPath 对您来说不方便,您可以使用更高级别的 UIBezierPath 并从中获取 CGPathRef。)

对于您的应用程序,最简单的选择可能是 CGPathAddArcToPoint 。当然,您需要延长循环以确定何时需要转弯而不是直线。然后,不要在新正方形的中间添加一条线,而是在其边缘添加一条线,然后添加一条弧,其 (x1, y1) 是正方形的中间, (x2, y2) 是直线离开正方形的边缘,半径 是正方形宽度的一半。

关于ios - 平滑路径角以与 SKAction followPath 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20615472/

相关文章:

ios - 使用 openURL 在 iOS 上打开 Facebook URL 会导致 Facebook 应用程序页面损坏

ios - 使用 React Native 在 iOS 中获取本地文件

ios - 如何使用 Sprite Kit Physics 创建一个 "cross"(或 "plus")形状的旋转对象?

ios - 如何在需要时生成 SKSpriteNode?

swift - 访问多个 SKShapeNodes 的属性

swift - Skspritenode 纹理动画不起作用

JavaScript/Swift + JavaScriptCore - 可以忽略 undefined variable 吗?

iOS 核心蓝牙 : Is there a way to do JustWorks pairing without showing the alert view on iOS?

ios - 允许用户在 if 语句中选择 Player Skin Found nil

swift - 简单的 Action 循环