将点添加到CGPath循环

时间:2016-02-15 15:10:06

标签: ios objective-c random sprite-kit

我正在开发一款需要角色SKNode *character到#34;随机"通过跟随随机生成的路径移动SKScene。我的问题是,我如何才能有效地编辑扩展此路径,以便角色始终遵循永无止境的路径?

这是一个大纲,其中包含一些代码片段,说明我如何接近这个:

1。创建一个CGMutablePathRef,代表要跟随的角色的路径。

以下是我用来生成路径的方法:

 - (void)createPath {
    // cgpath declared outside of this method to be retained
    cgpath = CGPathCreateMutable();

    // For simplicity, I am only dealing with positive random numbers for now 
    CGPoint s = CGPointMake(character.position.x, character.position.y);
    CGPoint e = CGPointMake([self randomNumber] + character.position.x, [self randomNumber] + character.position.y);
    CGPoint cp1 = CGPointMake([self randomNumber] + character.position.x, [self randomNumber] + character.position.y);
    CGPoint cp2 = CGPointMake([self randomNumber] + character.position.x, [self randomNumber] + character.position.y);
    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:NO duration:5];
    [character runAction:planeDestroy];

    CGPathRelease(cgpath);

}

- (int)randomNumber {
    return (int)(arc4random_uniform(100) + randPointRad);
}

2。在场景中运行SKAction以运行此方法,并使角色遵循路径。

以下是我正在使用的代码:

SKAction *wait = [SKAction waitForDuration:5];
SKAction *bla = [SKAction runBlock:^{
    [self createPath];
}];

SKAction *randomMovement = [SKAction sequence:@[wait,bla]];

[self runAction:[SKAction repeatActionForever: randomMovement] withKey:@"randomMovementAction"];

3。* (这是我遇到问题的步骤)使用新生成的随机点编辑/扩展当前的 cgpath ,以便在场景中随机连续移动角色

我理解我创建的路径使用下图中显示的逻辑 enter image description here

提供控制点(POC),我能够从定义的起点和终点生成路径。

我的目标是在此路径中添加新的随机控制点,每次添加时重新定义终点(到某个新的随机点,与前一点相距X距离,给出一定的连续性感和覆盖率),然后删除以前的控制点(以节省内存)。我正在尝试使用以下方法:

CGPathApply(<#CGPathRef  _Nullable path#>, <#void * _Nullable info#>, <#CGPathApplierFunction  _Nullable function#>)

通过添加新点和扩展整体路径来编辑路径,但由于路径由SKAction执行,我遇到了麻烦,所以它已经设置好了。

基本上,我试图重复一个动作,在已定义的路径上添加一个新的 POC ,强制路径增长,而不会显示可能的急转弯,速度变化或方向变化。

目前,字符确实在地图上随机地连续浮动,并且我已经显示了所提供的代码,但有时字符的运动非常不自然,因为cgpath(1)结束了,cgpath( 2)开始,依此类推到cgpath(n)。

所以有人知道是否有某种方法可以实现我的要求(扩展和cgpath而不必停止,然后开始一个全新的路径)? 至少可以防止角色执行任何这些尖锐的不吸引人的动作。提前感谢任何帮助。

更新:我现在能够想到的唯一解决方案是跟踪最后一个控制点 B1 与当前终点之间的角度 E1 ,然后在创建新路径时,确保 S2 A2 之间的角度完全相反(相同的运动方向)。像这样:

enter image description here

0 个答案:

没有答案