为什么UIBezierPath的行为如下?

时间:2014-09-08 17:21:00

标签: objective-c sprite-kit nodes uibezierpath cgpath

我做了一个小小的SpriteKit游戏,敌人跟随UIBezierPath。 (有没有其他方法可以做到这一点?这似乎非常无益)

无论如何,我的敌人表现得非常奇怪。这是一个直径为300的简单圆的代码:

    enemy.position = CGPointMake(0, 0);

    UIBezierPath* circlePath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0, 0, 300, 300)];

    CGPathRef pathRef = [cicrlePath CGPath];


    SKAction *followPath = [SKAction followPath:pathRef
                                       asOffset:NO
                                   orientToPath:NO
                                       duration: pathSpeed];




    SKAction *forever = [SKAction repeatActionForever:followPath];


    [enemy runAction:forever];

现在看看我如何指定敌人位置和(0,0)处的circlePath位置?

不知怎的,它给了我这个结果:http://www.gfycat.com/DistinctSnarlingAracari

我认为这不是真的有意义,因为它不合适吗?或者我错过了什么?

哦,就像我之前提到的那样,我怎么能以最有效/最有成效的方式为我的游戏做敌人动作?我目前正在使用带有UIBeziers的PaintCode,但它总是给我一个奇怪的结果。我真的很期待你的回答..

2 个答案:

答案 0 :(得分:1)

我认为您不理解-[UIBezierPath bezierPathWithOvalInRect:]CGRectMake。您的0, 0是椭圆的边界框的左上角,而不是中心,300, 300是该边界框的宽度和高度。如果您希望椭圆体位于0, 0的中心位置,请尝试以下操作:

UIBezierPath* circlePath = [UIBezierPath bezierPathWithOvalInRect:
    CGRectMake(-150, -150, 300, 300)];

答案 1 :(得分:1)

UIBezier椭圆形路径的中心位于(x +宽度/ 2,y +高度/ 2)。从角度= 0开始(椭圆上的最右边点,即(x +宽度,y +高度/ 2)),在场景坐标中逆时针绘制椭圆。因此,精灵将沿逆时针方向沿椭圆形路径行进,因为它沿着绘制路径的方向移动。

以下是可能对您有用的代码:

此方法创建一个以指定CGRect的位置(原点)为中心的椭圆路径。

- (CGPathRef) ovalInRect:(CGRect)rect
{
    CGFloat width = rect.size.width;
    CGFloat height = rect.size.height;
    CGFloat x = rect.origin.x-rect.size.width/2;
    CGFloat y = rect.origin.y-rect.size.height/2;

    return[UIBezierPath bezierPathWithOvalInRect: CGRectMake(x, y, width, height)].CGPath;
}

此方法创建一个沿圆形路径移动节点的SKAction。参数 指定路径的中心,半径和方向(YES =顺时针,NO =逆时针)。

- (SKAction *) createCircularPathActionAtLocation:(CGPoint)center
                                       withRadius:(CGFloat)radius
                                  andDirectionCW:(BOOL)directionCW

{
    CGRect rect = CGRectMake(center.x, center.y, radius*2, radius*2);
    CGPathRef ovalPath = [self ovalInRect:rect];
    SKAction *circlePathAction = [SKAction followPath:ovalPath asOffset:NO orientToPath:YES duration:5];
    SKAction *action;

    if (directionCW) {
        // Reverse the action to follow the path in the opposite direction
        action = [SKAction repeatActionForever:[circlePathAction reversedAction]];
    }
    else {
        action = [SKAction repeatActionForever:circlePathAction];
    }
    return action;
}

旁注:如果您使用的是PaintCode 2,则可以使用变量而不是绝对值来概括它生成的代码。