我正在开发一款需要角色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 ,以便在场景中随机连续移动角色
提供控制点(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 之间的角度完全相反(相同的运动方向)。像这样: