【问题标题】:How to move a sprite along a CGPath with variable velocity如何以可变速度沿 CGPath 移动精灵
【发布时间】:2014-08-03 05:18:01
【问题描述】:

我正在编写游戏并希望沿固定路径(直线和曲线 - 考虑铁路引擎)移动精灵,但我希望能够根据精灵速度来驱动动画 - 并更改该速度作为响应到游戏活动。

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

CGPath 似乎是定义精灵路径的正确构造,但那里似乎没有足够的功能来抓取路径上的点并进行我自己的数学运算。

谁能推荐一个合适的方法?

【问题讨论】:

  • 感谢@Revinder,但这似乎以我描述的方式使用 followPath,它不允许随着时间的推移改变速度。
  • @JustinHawkins,您找到解决方案了吗?你问的同样的事情我想知道怎么做。

标签: ios sprite-kit


【解决方案1】:

您可以使用其 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];

改变SKAction速度的方法...

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

【讨论】:

  • 我想避免做复杂的计算,根据物体速度和其他因素修改动画持续时间。似乎有点倒退:-)不过,如果混乱的话,这可能是可行的。有没有办法“手动”将精灵放在 CGPath 中的一个点上?使用 SKAction 不是必需的,如果可以的话,我可能可以自己处理运动的东西。
  • 以恒定速度沿任意 CGPath 移动精灵并非易事。确定动画持续时间相对容易。角色的加速是确定性的还是随机事件的结果(例如,敌人追逐它)?
  • 我认为我将采取的方法是预先计算每个 CGPath 的持续时间,以便精灵以某个基线速度移动(这可能需要一些猜测/目测),然后修改精灵速度属性以根据需要减慢(或停止)它。然后我想每条路径只需要一个动作,并且该路径上的精灵可以以不同的速度移动。初步测试似乎很有希望。
【解决方案2】:

尝试一些这样的想法:

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

【讨论】:

  • 正如我上面所说,我需要让精灵以任意变化的速度沿着路径移动,这似乎不支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2018-08-20
相关资源
最近更新 更多