sprite-kit - 如何使 Sprite 遵循贝塞尔曲线

标签 sprite-kit bezier 2d-games

我对objective-c和sprite kit还很陌生,但我已经做了一段时间的游戏开发。我目前正在开发一个 2d 游戏,我的敌舰在屏幕上从右向左移动。我一直在关注我游戏不同部分的教程,然后在必要时添加它。我找到了一个教程,其中游戏中的敌人遵循贝塞尔曲线,我已经设法在我的游戏中实现了这一点,但是由于我是贝塞尔曲线的新手,我并不完全理解它们,并且算法使我的 Sprite 从上到下移动但我需要他们从左到右。

我已经包含了我用来将贝塞尔曲线添加到我的 Sprite 的代码片段,关于如何让它们从右到左而不是从上到下移动的任何建议。

CGMutablePathRef cgpath = CGPathCreateMutable();

        float xStart = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width];
        float xEnd = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width];
        float cp1X =[self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width];
        float cp1y = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.height];
        float cp2x = [self getRandomNumberBetween:0+asteroid.size.width to:self.frame.size.width-asteroid.size.width];
        float cp2Y = [self getRandomNumberBetween:0 to:cp1y];

        CGPoint s = CGPointMake(xStart, 1024.0);
        CGPoint e = CGPointMake(xEnd, -100);
        CGPoint cp1 = CGPointMake(cp1X, cp1y);
        CGPoint cp2 = CGPointMake(cp2x, cp2Y);
        CGPathMoveToPoint(cgpath, NULL, s.x, s.y);
        CGPathAddCurveToPoint(cgpath, NULL, cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y);

        SKAction *enemyCurve = [SKAction followPath:cgpath asOffset:NO orientToPath:YES duration:5];

  CGPoint location = CGPointMake(-self.frame.size.width-asteroid.size.width, randY);

        SKAction *moveAction = [SKAction moveTo:location duration:randDuration];
        SKAction *doneAction = [SKAction runBlock:(dispatch_block_t)^(){

            asteroid.hidden = YES;
        }];

        SKAction *moveAsteroidActionWithDone = [SKAction sequence:@[enemyCurve,moveAction, doneAction]];

感谢您的任何帮助和建议。

最佳答案

贝塞尔曲线用于生成两点之间的平滑曲线。
要从左向右移动路径,请选择左侧的起点并选择右侧的终点。这两个控制点决定了从左到右的路径形状。改变 startpointendpoint下面的代码将控制贝塞尔曲线的起点和终点。改变 control points改变曲线的形状。您可以通过附带的 GIF 看到这一点。

CGMutablePathRef cgpath = CGPathCreateMutable();

CGPoint startingPoint = CGPointMake(50, 100);

CGPoint controlPoint1 = CGPointMake(160, 250);
CGPoint controlPoint2 = CGPointMake(200, 140);

CGPoint endingPoint = CGPointMake(303, 100);


CGPathMoveToPoint(cgpath, NULL, startingPoint.x, startingPoint.y);
CGPathAddCurveToPoint(cgpath, NULL, controlPoint1.x, controlPoint1.y,
                      controlPoint2.x, controlPoint2.y,
                      endingPoint.x, endingPoint.y);


SKAction *enemyCurve = [SKAction followPath:cgpath asOffset:NO orientToPath:YES duration:5];

[enemy runAction:[SKAction sequence:@[[SKAction waitForDuration:1],enemyCurve]]];

enter image description here
P0P3是起点和终点,P1P2是控制点。

查看此页面以更多地使用贝塞尔曲线。
http://www.jasondavies.com/animated-bezier/

关于sprite-kit - 如何使 Sprite 遵循贝塞尔曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28341998/

相关文章:

ios - SKAction 继续工作

geometry - 如何用贝塞尔曲线创建圆?

c++ - 如何在 SDL 2.0 中清除屏幕的一部分

ios - Sprite 套件碰撞 : ignore transparency?

ios - 在设备而不是模拟器上运行 sprite-kit 项目时将每秒帧数设置为 30

ios - SpriteKit、XCode 8、Swift 3 MGGetBoolAnswer 在模拟器中不可用

javascript - html5 使用 bezierCurveTo 绘制高斯函数

c++ - Cocos2d 以贝塞尔速度移动

java - 如何用java.Swing移动乒乓 Racket ?

javascript - 在 4x4 板上平均分配字母