Ios 如何以可变速度沿CG路径移动精灵

Ios 如何以可变速度沿CG路径移动精灵,ios,sprite-kit,Ios,Sprite Kit,我正在编程一个游戏,想沿着固定的路径移动一个精灵(直线和曲线-想想铁路引擎),但我想能够根据精灵的速度驱动动画-并根据游戏事件改变速度 followPath:duration:in SKAction很接近,但似乎没有办法“在飞行中”调整速度-我绝对关心精灵的速度-而不是“跟随路径的持续时间” CGPath似乎是定义精灵路径的正确构造,但似乎没有足够的功能来获取路径上的点并进行我自己的计算 有人能提出一个合适的方法吗?试着这样想: CGMutablePathRef cgpath = CGPathC

我正在编程一个游戏,想沿着固定的路径移动一个精灵(直线和曲线-想想铁路引擎),但我想能够根据精灵的速度驱动动画-并根据游戏事件改变速度

followPath:duration:in SKAction很接近,但似乎没有办法“在飞行中”调整速度-我绝对关心精灵的速度-而不是“跟随路径的持续时间”

CGPath似乎是定义精灵路径的正确构造,但似乎没有足够的功能来获取路径上的点并进行我自己的计算


有人能提出一个合适的方法吗?

试着这样想:

CGMutablePathRef cgpath = CGPathCreateMutable();

//random values
float xStart = [self getRandomNumberBetween:0+enemy.size.width to:screenRect.size.width-enemy.size.width ];
float xEnd = [self getRandomNumberBetween:0+enemy.size.width to:screenRect.size.width-enemy.size.width ];

//ControlPoint1
float cp1X = [self getRandomNumberBetween:0+enemy.size.width to:screenRect.size.width-enemy.size.width ];
float cp1Y = [self getRandomNumberBetween:0+enemy.size.width to:screenRect.size.width-enemy.size.height ];

//ControlPoint2
float cp2X = [self getRandomNumberBetween:0+enemy.size.width to:screenRect.size.width-enemy.size.width ];
float cp2Y = [self getRandomNumberBetween:0 to:cp1Y];

CGPoint s = CGPointMake(xStart, 1024.0);
CGPoint e = CGPointMake(xEnd, -100.0);
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 *planeDestroy = [SKAction followPath:cgpath asOffset:NO orientToPath:YES duration:5];
[self addChild:enemy];

SKAction *remove2 = [SKAction removeFromParent];
[enemy runAction:[SKAction sequence:@[planeDestroy,remove2]]];

CGPathRelease(cgpath);

您可以使用SKAction的speed属性调整任何SKAction的执行速度。例如,如果将action.speed设置为2,则该动作将以两倍的速度运行

SKAction *moveAlongPath = [SKAction followPath:path asOffset:NO orientToPath:YES duration:60];
[_character runAction:moveAlongPath withKey:@"moveAlongPath"];
然后可以通过以下方式调整角色的速度:

[self changeActionSpeedTo:2 onNode:_character];
方法更改操作的速度

- (void) changeActionSpeedTo:(CGFloat)speed onNode:(SKSpriteNode *)node
{
    SKAction *action = [node actionForKey:@"moveAlongPath"];
    if (action) {
      action.speed = speed;
    }
}

请参考此链接,谢谢@Revinder,但它似乎以我所描述的方式使用followPath,这不允许随时间改变速度。@JustinHawkins,您找到解决方案了吗?和你问的一样,我想知道怎么做。如上所述,我需要让精灵以任意变化的速度沿着路径移动,这似乎不支持。我希望避免进行复杂的计算,根据对象速度和其他因素修改动画持续时间。似乎有点倒退:-)这可能是可行的,但如果混乱。有没有办法“手动”将精灵放置在CGPath中的某个点上?使用SKAction并不是一个要求,如果我能做到的话,我可能自己也能处理移动的事情。以恒定的速度沿着任意的路径移动一个精灵是不平凡的。确定动画持续时间相对容易。角色的加速是决定性的还是随机事件的结果(例如,敌人追赶它)?我认为我将采取的方法是预先计算每个CGPath的持续时间,这样精灵将以某个基线速度移动(这可能需要一些猜测/目测),然后根据需要修改“精灵速度”属性以降低速度(或停止速度)。然后我想我只需要对每条路径执行一个动作,路径上的精灵可以以不同的速度移动。初步测试似乎很有希望。